UVa 10048 (Floyd变形) Audiophobia

时间:2023-12-03 21:10:02

题意:

给一个带权无向图,和一些询问,每次询问两个点之间最大权的最小路径。

分析:

紫书上的题解是错误的,应该是把原算法中的加号变成max即可。但推理过程还是类似的,如果理解了Floyd算法的话,这个应该也很容易理解。

 #include <cstdio>
#include <algorithm>
using namespace std; const int maxn = + ;
const int INF = ;
int d[maxn][maxn]; int main()
{
//freopen("in.txt", "r", stdin);
int kase = , n, m, q;
while(scanf("%d%d%d", &n, &m, &q) == && n)
{
for(int i = ; i < n; ++i)
{
d[i][i] = ;
for(int j = i+; j < n; ++j)
d[i][j] = d[j][i] = INF;
} for(int i = ; i < m; ++i)
{
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
u--, v--;
d[u][v] = d[v][u] = w;
} for(int k = ; k < n; ++k)
for(int i = ; i < n; ++i)
for(int j = ; j < n; ++j)
if(d[i][k] < INF && d[k][j] < INF)
d[i][j] = min(d[i][j], max(d[i][k], d[k][j])); if(kase) printf("\n");
printf("Case #%d\n", ++kase);
while(q--)
{
int u, v;
scanf("%d%d", &u, &v);
u--, v--;
if(d[u][v] == INF) puts("no path");
else printf("%d\n", d[u][v]);
}
} return ;
}

代码君