转自 https://blog.csdn.net/shuangde800/article/details/7985085
题目大意:
从a点到b点, 找到一条路径,使得这条路径上的所有噪音中最大的值是所有路径中最小的, 这个噪音值便是要求的。
分析与总结:
用floyd是找出所有路径中长度最小的,只需要稍微变形一下,便可求得答案。
除了用这个方法,还可以用Kruskal算法,按照Kruskal算法的步骤,一条边一条边的加入树中,每加入一次,就判断所有要问的起点和终点是否已经连通, 一旦有连通的,那么那条路径中的最大值便是当前加入的这条边的权值,因为加入的边是按照从小到大顺序加入的。
#include<cstdio>
#include<cstring>
#include<algorithm>
const int N = 105;
const int INF = 1000000000;
using namespace std;
int d[N][N], n, m, Q;
inline void read_graph(){
for(int i=1; i<N; ++i){
d[i][i] = INF;
for(int j=i+1; j<N; ++j)
d[i][j]=d[j][i]=INF;
}
int a,b,c;
for(int i=0; i<m; ++i){
scanf("%d%d%d",&a,&b,&c);
d[a][b]=d[b][a]=c;
}
}
inline void Floyd(){
for(int k=1; k<=n; ++k){
for(int i=1; i<=n; ++i){
for(int j=1; j<=n; ++j){
int tmp = max(d[i][k], d[k][j]);
d[i][j] = min(d[i][j], tmp);
}
}
}
}
inline void output(){
int u,v;
for(int i=0; i<Q; ++i){
scanf("%d%d",&u,&v);
if(d[u][v]!=INF) printf("%d\n",d[u][v]);
else printf("no path\n");
}
}
int main(){
int a,b,c,cas=1;
while(~scanf("%d%d%d",&n,&m,&Q)){
if(!n&&!m&&!Q) break;
read_graph();
Floyd();
if(cas!=1) puts("");
printf("Case #%d\n",cas++);
output();
}
return 0;
}
网友评论