您的位置:首页 > 运维架构

UVa 10048 Audiophobia【Floyd】

2015-04-06 10:09 447 查看
题意:给出一个c个点,s条边组成的无向图,求一点到另一点的路径上最大权值最小的路径,输出这个值

可以将这个

d[i][j]=min(d[i][j],d[i][k]+d[k][j])

改成 d[i][j]=min(d[i][j],max(d[i][k],d[k][j]))

即为先找出最大权值的一条边,再从这些边中找出最小的

#include<iostream>
#include<cstdio>
#include<cstring>
#include <cmath>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<algorithm>
#define mod=1e9+7;
using namespace std;

typedef long long LL;
const int INF = 0x7fffffff;
const int maxn=110;
int d[maxn][maxn];

int main(){
int n,m,q,i,j,k,kase=0,u,v,w;
while(scanf("%d %d %d",&n,&m,&q)!=EOF&&n&&m&&q){

for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
if(i==j) d[i][j]=0;
else d[i][j]=INF;
}
}
for(i=1;i<=m;i++){
scanf("%d %d %d",&u,&v,&w);
d[u][v]=w;//无 向图,所以两个方向都赋上权值
d[v][u]=w;
}

for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
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 x,y;
scanf("%d %d",&x,&y);

if(d[x][y]!=INF)     printf("%d\n",d[x][y]);
else printf("no path\n");
}
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: