题解
网的邻接矩阵2
1 条题解
-
0
PP4887 网的邻接矩阵2(基础)
这道题和 P4884 是同一道题:输入一个无向的网,把权值存进邻接矩阵并输出,没有边的地方用 999 表示。题目已经提供了完整的输入格式和输出要求,我们照做即可。
解题思路
第一步,回顾无向网。 "网"是带权值的图,每条边有一个数值 w。无向网中边是双向的,从 x 到 y 能走,从 y 到 x 也能走,权值都是 w。
第二步,初始化矩阵。 先把 n×n 的矩阵全部填成 999,对角线 a[i][i] 也是 999,表示自己和自己没有边。这样处理之后,矩阵里 999 就代表"没有路",和样例中的 999 完全对应。
第三步,读边写权值。 每读一条 x y w,做两次赋值:a[x][y]=w 和 a[y][x]=w。例如样例 2 1 2,结点 1 和 2 之间的权值是 2,那么 a[1][2] 和 a[2][1] 都填 2;3 2 10 这条边让 a[3][2] 和 a[2][3] 都填 10。
第四步,逐行输出。 外层循环控制行,内层循环控制列,同一行数字之间用一个空格隔开,每输出完一行换行。样例第一行 999 2 3 8,正是结点 1 到 2、3、4 的三条边的权值。
第五步,常见错误提醒。 最容易犯的错是漏写反向赋值 a[y][x]=w,那样无向网会变成有向网;其次是忘记把矩阵初始化为 999,导致没边的地方输出 0。写完可以用对称性检查:a[i][j] 和 a[j][i] 应该相等。
参考代码
// 输入无向网的边和权值,建立邻接矩阵并输出,无边处用999 #include <iostream> using namespace std; int a[505][505]; int main() { int n, m; cin >> n >> m; for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) a[i][j] = 999; // 初始全部无边 for (int k = 0; k < m; k++) { int x, y, w; cin >> x >> y >> w; a[x][y] = w; a[y][x] = w; // 无向网,两个方向权值相同 } for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { if (j > 1) cout << " "; cout << a[i][j]; } cout << endl; } return 0; }复杂度分析
复杂度分析:初始化矩阵需要 O(n²) 时间,读入 m 条边需要 O(m),输出矩阵需要 O(n²),总时间复杂度 O(n²),空间复杂度 O(n²)。n 是结点数,数据规模很小,程序运行很快。
- 1