题目描述
给定一个 𝑛个顶点 𝑚 条边的无向图。请以邻接矩阵和邻接表的形式输出这一张图。
输入格式
第一行输入两个正整数 𝑛和 𝑚,表示图的顶点数和边数。
第二行开始,往后 𝑚 行,每行输入两个以空格隔开的正整数 𝑢,𝑣,表示 𝑢,𝑣 顶点之间有一条边直接相连。
输出格式
首先输出 𝑛 行 𝑛列的矩阵,以空格隔开每一行之间的数表示邻接矩阵。第 𝑖 行第 𝑗列的数为 1 则表示顶点 𝑖,𝑗 之间有一条边直接相连;若为 00 则表示没有直接相连的边。
再往后输出 𝑛 行。第 𝑖 行首先先输出一个整数 𝑑i,表示这个顶点的度数,再按照从小到大的顺序,依次输出与顶点 𝑖i直接相连的所有顶点。
输入输出样例
输入 #1
5 5 1 2 2 3 3 5 1 3 3 4
输出 #1
0 1 1 0 0 1 0 1 0 0 1 1 0 1 1 0 0 1 0 0 0 0 1 0 0 2 2 3 2 1 3 4 1 2 4 5 1 3 1 3
说明/提示
样例的图如图所示:
随后,就可以看思路了
我们先看一下两种存储方式
1.邻接矩阵
哪个区块是1(黄色,代表这里的点i,j相连(i横轴,J纵轴))
为了让大家看得更清楚一些,我呢,多加一些点,改一下颜色,看得更清楚
如果还不够,只能加剪头了
接下来看邻接表,每个值代表和下标i节点相连的点
好了,接下来就是代码了
对了,还有怎么付值
邻接矩阵
邻接表
接下来,就是大快人心的代码时刻了
呜呜呜,我试了好多遍
算了,不废话了
#include<bits/stdc++.h>
#include<bits/c++config.h>
using namespace std;
vector<int> g[114514];//适量开大没坏处
bool a[10001][10001]; //适量开大没坏处
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n,m;
cin>>n>>m;
for(int i=0;i<m;i++){
int u,v;
cin>>u>>v;
g[v].push_back(u);
g[u].push_back(v);
a[u][v]=1;
a[v][u]=1;
}
for(int i=0+1;i<=n;i++){//n个节点,小于等于n就行了,下标从一开始
for(int j=0+1;j<=n;j++){
cout<<a[i][j]<<' ';
}
cout<<endl;
}
for(int i=1;i<=n;i++){
cout<<g[i].size()<<' ';//他这里有的元素数量
sort(g[i].begin(),g[i].end());//sort,不会的自己bdfs去,,
for(int j=0;j<g[i].size();j++){
cout<<g[i][j]<<' ';
}
cout<<endl;
}
return 0;//45
}