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;
}