top1编程
← 返回题目
题解

网的邻接矩阵2

1 条题解

  • 0
    @ 2026-8-7 13:04:05

    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