#12342. 珅泽教育CSP-J第一轮模拟考第二十六套 第 26 题

珅泽教育CSP-J第一轮模拟考第二十六套 第 26 题

二、阅读程序(判断题请选择“正确”或“错误”;除特殊说明外,判断题 2 分、选择题 3 分,共 40 分)

程序(2)

#include <cstdio>
#include <cstring>
using namespace std;
int n, m;
int f[101][101];
int F[101][101];
int main() {
    scanf("%d%d", &n, &m);  // n 的值在 1 到 100 之间
    memset(f, -1, sizeof(f));
    for (int i = 1; i <= m; i++) {
        int u, v, w;  // w 的值在 0 到 10000 之间
        scanf("%d%d%d", &u, &v, &w);
        f[u][v] = f[v][u] = w;
    }
    for (int k = 1; k <= n; k++)
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= n; j++)
                if (f[i][k] != -1 && f[k][j] != -1)
                    if (f[i][j] == -1 || f[i][j] > f[k][j] + f[i][k])
                        f[i][j] = f[i][k] + f[k][j];
    int ans = 2147483647;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++) {
            for (int x = 1; x <= n; x++)
                for (int y = 1; y <= n; y++)
                    F[x][y] = f[x][y];
            F[i][j] = F[j][i] = 0;
            for (int x = 1; x <= n; x++)
                for (int y = 1; y <= n; y++)
                    if (F[x][y] == -1 || F[x][y] > F[x][i] + F[i][y])
                        F[x][y] = F[x][i] + F[i][y];
            for (int x = 1; x <= n; x++)
                for (int y = 1; y <= n; y++)
                    if (F[x][y] == -1 || F[x][y] > F[x][j] + F[j][y])
                        F[x][y] = F[x][j] + F[j][y];
            int res = 0;
            for (int x = 1; x <= n; x++)
                for (int y = 1; y < x; y++)
                    res += F[x][y];
            ans = min(res, ans);
        }
    printf("%d\n", ans);
    return 0;
}
  1. 若输入数据为 4 5/1 2 3/1 3 6/2 3 4/2 4 7/3 4 2(其中 / 为换行符),则输出为( )。

{{ select(1) }}

  • 14
  • 18
  • 21
  • 28