標籤:
題目大意:
給你一個n個節點,m條邊的圖,然後,給出q個詢問,讓你找出一條從u到v的路徑中所經過的最大權值最小的路徑權值。
解題思路:
直接使用floyd的變形來做。
e[i][j] = min(e[i][j],e[i][k]+e[k][j])---->e[i][j] = min(e[i][j],max(e[i][k],e[k][j]));
代碼:
# include<cstdio># include<iostream>using namespace std;# define MAX 123# define inf 99999999int e[MAX][MAX];int n,m,q;void init(){ for ( int i = 1;i <=n ;i++ ) { for ( int j = 1;j <= n;j++ ) { if ( i==j ) e[i][j] = 0; else e[i][j] = inf; } }}void floyd(){ for ( int k = 1;k <= n;k++ ) { for ( int i = 1;i <= n;i++ ) { for ( int j = 1;j <= n;j++ ) { if ( e[i][k]<inf&&e[k][j]<inf ) e[i][j] = min(e[i][j],max(e[i][k],e[k][j])); } } }}void print(){ for ( int i = 1;i <= n;i++ ) { for ( int j = 1;j <= n;j++ ) { cout<<e[i][j]<<" "; } cout<<endl; }}int main(void){ int icase = 0; while ( scanf("%d%d%d",&n,&m,&q)!=EOF ) { if ( n==0 ) break; init(); while ( m-- ) { int a,b,c; scanf("%d%d%d",&a,&b,&c); e[a][b] = min(e[a][b],c); e[b][a] = c; } if (icase) puts(""); printf("Case #%d\n",++icase); floyd(); // print(); while ( q-- ) { int t1,t2; scanf("%d%d",&t1,&t2); int ans = e[t1][t2]; if (ans!=inf) printf("%d\n",ans); else printf("no path\n"); } } return 0;}
11.3.4 例題11-5 UVA 247 Audiophobia(兩點間最大權最小_floyd()變形)