图【东北大学oj数据结构11-1】C++
有两种标准方式来表示图 G=(V,E) (其中V顶点的集合, E是边的集合),分别是:邻接表表示和邻接矩阵表示。
邻接表表示由 ∣V∣个数组 Adj[∣V∣]组成列表,第 i 个数组 Adj[i] 存储顶点集中第 i 个顶点的相关信息。对于每个 u∈V,邻接列表 Adj[u]包含所有顶点 v,使得存在边 (u,v)∈E。也就是说,Adj[u]由 G 中与 u 相邻的所有顶点组成。
邻接矩阵表示法由一个大小为∣V∣×∣V∣矩阵组成。其中第 i 行第 j 列的元素为A=aij。如果 (i,j)∈E 则aij=1 ,否则aij=0
编写一个程序,读取由邻接表表示的有向图 G,并打印其邻接矩阵表示。 其中图 G 由 n 个顶点组成,编号从1~n
输入
在第一行中,给出了一个整数 n。
在接下来的 n 行中,顶点 u 的邻接表 Adj[u] 以下列格式给出:
ukv1v2…vk
其中 u 是顶点 ID,k 表示它的度数,vi 是与 u 相邻的顶点的 ID。
输出
如以下示例输出所示,打印 G 的相邻矩阵表示。
在 aij 之间放置一个空格字符。
约束
1≤n≤100
输入样例
4
1 2 2 4
2 1 4
3 0
4 1 3
输出样例
0 1 0 1
0 0 0 1
0 0 0 0
0 0 1 0
#include <iostream>
#include <vector>
#include <iomanip>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
vector<vector<int>> a(n);//邻接表
for(int i=0;i<n;i++)
{
int u,k;
cin>>u>>k;
u--;
for(int j=0;j<k;j++)
{
int v;
cin>>v;
v--;
a[u].push_back(v);
}
}
vector<vector<int>> b(n,vector<int>(n,0));//邻接矩阵_初始化为0
for(int u=0;u<n;u++)
{
for(int i=0;i<a[u].size();i++)
{
int v=a[u][i];
b[u][v]=1;
}
}
for(int i=0;i<b.size();i++)
{
for(int j=0;j<b[i].size();j++)
{
cout<<b[i][j]<<" ";
}
cout<<endl;
}
return 0;
}