您的位置:首页 > 其它

uva10048 ( floyd,最大值最小化)

2017-03-23 22:31 471 查看
心痛,紫书上的这个和ccf一样的,但我没做。。。先去哭一回。。。

紫书上是这样给出证明的:任意的从i到j的路,如果至少由两条边组成,那么在联通的两条边中直接取最大值;如果从i到j的路是不联通的,那么一定在d[i][j]=min(d[i][j],max(d[i][k],d[k][j]));
中的三个数中至少有两个是INF 那么最终由最大值是否为INF 就可以得出是否是no path

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cstring>
#define maxn 1000
#define INF 100000000
using namespace std;
int c,s,q;
int d[maxn][maxn];
void Init()
{
for(int i=0;i<maxn;i++)
{
for(int j=0;j<maxn;j++)
{
if(i==j) d[i][j]=0;
else d[i][j]=INF;
}
}
}
void floyd()
{
for(int k=0;k<c;k++)
{
for(int i=0;i<c;i++)
{
for(int j=0;j<c;j++)
{
d[i][j]=min(d[i][j],max(d[i][k],d[k][j]));
}
}
}
}
int main ()
{
int kase=1;
while(scanf("%d%d%d",&c,&s,&q)!=EOF)
{
if(!c&&!s&&!q) break;
int from,to,cost;
Init();
for(int i=0;i<s;i++)
{
scanf("%d%d%d",&from,&to,&cost);
--from;
--to;
d[from][to]=cost;
d[to][from]=cost;
}
floyd();
if(kase!=1) printf("\n");
printf("Case #%d\n",kase++);
for(int i=0;i<q;i++)
{
scanf("%d%d",&from,&to);
--from;
--to;
if(d[from][to]==INF) printf("no path\n");
else printf("%d\n",d[from][to]);
}

}

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