题目大意:城市的平面图已给定, n 个路口标号为 1 到 n ,路口之间的每条街道都标有承重限制。任务是找出从路口 1 (李凌所在地)到路口 n (客户所在地)的道路上的最大承重能力。假定至少存在一条这样的道路。每条街道都可以双向行驶。
考察点:dijkstra
思路分析:一开始就想到了dijkstra,但是一直写不好,主要是扩展节点的时候不知道该怎么扩展。后来参考了伟神的博客http://blog.youkuaiyun.com/zhangwei1120112119/article/details/8553691,每次扩展的时候扩展载重最大的那个就行了。
#include<stdio.h>
#include<stdbool.h>
#define max(x,y) (x)>(y)? (x):(y)
int t;
int a[1001][1001];
int f[1001];
bool flag[1001];
int main()
{
int n,m,i,j,k,p,c,s;
scanf("%d",&t);
for (p=1;p<=t;p++)
{
scanf("%d%d",&n,&m);
memset(a,0,sizeof(a));
memset(flag,false,sizeof(flag));
memset(f,0,sizeof(f));
for (i=1;i<=m;i++)
{
scanf("%d%d%d",&j,&k,&c);
a[j][k]=max(a[j][k],c);a[k][j]=a[j][k];
}
f[1]=5000000;
while (2>1)
{
s=-1;
for (i=1;i<=n;i++)
if (flag[i]==false)
{
if ((s==-1)||(f[i]>f[s]))
s=i;
}
if (s==-1) break;
flag[s]=true;
for (i=1;i<=n;i++)
{
if (f[s]<a[s][i])
{
if (f[s]>f[i])
f[i]=f[s];
}
else {
if (a[s][i]>f[i])
f[i]=a[s][i];
}
}
}
printf("City #%d:\n",p);
printf("%d\n\n",f[n]);
}
return 0;
}