#12343. 珅泽教育CSP-J第一轮模拟考第二十六套 第 27 题
珅泽教育CSP-J第一轮模拟考第二十六套 第 27 题
二、阅读程序(判断题请选择“正确”或“错误”;除特殊说明外,判断题 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;
}
- 这个程序使用了( )算法。
{{ select(1) }}
- Floyd
- Dijkstra
- Prim
- Kruskal