最短路的变形,,,,应该最好用dijstra算法的,,,,我任性的用了Floyd,,,还是过了。。。。时间比较长(不过好写啊!!!!)
核心变形是这步: dis[i][j] = min(dis[i][j], max(dis[i][k], dis[k][j]));
#include<stdio.h>
#include<string.h>
#include <algorithm>
#include <bits/stdc++.h>
using namespace std;
int dis[1001][1001];
int main()
{
int cas;
int m,n;
scanf("%d",&cas);
int t=1;
while(cas--)
{
scanf("%d%d",&n,&m);
int i,j,k;
for(i=0;i<=n;i++)
{
for(j=0;j<=n;j++)
{
if(i==j) dis[i][j]=0;
else dis[i][j]=999999;
}
}
int u,v,w;
for(i=0;i<m;i++)
{
scanf("%d%d%d",&u,&v,&w);
if(dis[u][v]!=999999)
{
if(dis[u][v]>w)
{
dis[u][v]=w;
dis[v][u]=w;
}
}
else
{
dis[u][v]=w;
dis[v][u]=w;
}
}
for ( k=0; k<n;++k)
for (i=0;i<n; ++i )
for ( j = 0; j < n; ++j )
{
dis[i][j] = min(dis[i][j], max(dis[i][k], dis[k][j]));
}
int q;
scanf("%d",&q);
printf("Case %d:\n",t++);
for(i=0;i<n;i++)
{
if(dis[i][q]==999999) puts("No way");
else printf("%d\n",dis[i][q]);
}
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。