题意:n个点,m条边,每条边有自己的权值,删除其中d条边,问重新使点A到点B联通所需要恢复的边的最小权值和
这个数据范围,
只和删除的边的边权有关,不删除的边只需要记录联通情况即可
以删除的边做floyd搞起
将原来就有的m条边边权记录下来,f中记录成0——表示两点可以联通且经过不需要代价
将删除的边在f中改成边权——表示两点可以连通且经过时需要花费原边权的代价
#include<stdio.h>
#include<string.h>
int min(int x, int y) {
return((x) < (y) ? (x) : (y));
}
int main() {
int n, m, d;
int i, j, k;
int map[110][110], f[110][110];
int x, y, z;
scanf("%d", &n);
memset(f, 63, sizeof(f));
//
scanf("%d", &m);
for (i = 1; i <= m; i++) {
scanf("%d %d %d", &x, &y, &z);
f[x][y] = f[y][x] = 0;
map[y][x] = map[x][y] = z;
}
//
scanf("%d", &d);
for (i = 1; i <= d; i++) {
scanf("%d %d", &x, &y);
f[x][y] = f[y][x] = map[x][y];
}
//
for (k = 1; k <= n; k ++)
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
if ((i != j) && (i != k) && (k != j))
f[i][j] = min(f[i][j], f[i][k] + f[k][j]);
//
scanf("%d %d", &x, &y);
printf("%d\n", f[x][y]);
}
——Eirlys