4410: 【例18-2】图的存储-邻接表
内存限制:128 MB
时间限制:1.000 S
评测方式:文本比较
命题人:
提交:2
解决:2
题目描述
现希望将第二张图和第三张图 存进计算机。 可以使用邻接矩阵存储一张图: 记 v[i][j] 表示从 i 到 j 的边权。 如果不通可以设置为 0 或者 inf (一个很大的数字)。 无向图的邻接矩阵是对称的, 有向图的邻接矩阵则不对称。把邻接表转换为邻接矩阵。
样例输入 复制
4 6
1 3 2
2 1 1
2 4 6
3 4 5
4 1 4
4 1 3
样例输出 复制
0 0 2 0
1 0 0 6
0 0 0 5
3 0 0 0
提示
#include<bits/stdc++.h> using namespace std; #define MAXN 1005 struct edge { // 记录边的终点,边权的结构体 int to, cost; }; int n, m; // 图有 n 个点 m 条边 vector <edge> p[MAXN]; // 邻接表 int v[MAXN][MAXN]; // 邻接矩阵 int main(){ cin >> n >> m; for (int i = 1; i <= m; i++) { int u, v, l; cin >> u >> v >> l; p[ u ].push_back((edge) {v, l}); // p[ v ].push_back((edge){u, l}); // 无向图邻接表要加一条反方向的边 } // 遍历邻接表,把邻接表转换为邻接矩阵 for (int i = 1; i <= n; i++) for (int j = 0; j < p[i].size(); j++) v[i][p[i][j].to] = p[i][j].cost; // 输出邻接矩阵 for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) cout<<v[i][j]<<' '; cout<<'\n'; } return 0; }