7-13 图的存储 (15 分)
输出给定图的邻接矩阵和邻接表。
输入格式:
输入第一行给出三个正整数,分别表示无向图的节点数N(1<N≤10)、边数M(≤50)和有向或无向标志S(1表示有向图,0表示无向图)。
随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号。
输出格式:
首先输出图的邻接矩阵,即N行N列的元素值,有边其值为1,无边其值为0;以方阵形式输出,每个元素间有一个空格,末尾均有一空格。
然后输出图的邻接表,从第0行开始按顺序输出,共输出N行,具体样式见输出样例。冒号前后无空格,每个元素间有一个空格,末尾均有一空格。
由于图的存储是不唯一的,为了使得输出具有唯一的结果,我们约定以表头插入法构造邻接表。
输入样例:
6 8 0
1 2
2 3
3 4
4 5
5 6
6 4
3 6
1 5
输出样例:
0 1 0 0 1 0
1 0 1 0 0 0
0 1 0 1 0 1
0 0 1 0 1 1
1 0 0 1 0 1
0 0 1 1 1 0
0:4 1
1:2 0
2:5 3 1
3:5 4 2
4:0 5 3
5:2 3 4
AC
习惯使用动态数组!!!
邻接表的插入方法:头插法和尾插法
#include<bits/stdc++.h>
using namespace std;
int main() {
int n,m,s;
cin>>n>>m>>s;
int x[n][n];
vector<int> v[n];//动态二维数组
memset(x,0,sizeof(x));//清零操作,只能对int进行赋值为0,其他值都错误
for(int i=0; i<m; i++) {
int a,b;
cin>>a>>b;
if(s==1) { //有向图
x[a-1][b-1]=1;
v[a-1].push_back(b-1);
} else { //无向图
x[a-1][b-1]=x[b-1][a-1]=1;
v[a-1].push_back(b-1);
v[b-1].push_back(a-1);
}
}
//输出 邻接矩阵
for(int i=0; i<n; i++) {
for(int j=0; j<n; j++) {
cout<<x[i][j]<<" ";
}
cout<<endl;
}
//输出 邻接表
for(int i=0; i<n; i++) {
cout<<i<<":";
for(int j=v[i].size()-1; j>=0; j--) {
cout<<v[i][j]<<" ";
}
cout<<endl;
}
return 0;
}