题目大意:谢谢羽哥提供的题目大意,哎,心寒了,英语太差了,对不起6级证书啊~~55~~题目大意就是求最大载重量,
也就是求每条路径的最小值,所有的路径最小值的最大值~~
思路:我怎么想都想不到地杰斯特拉上面啊~~55~~刚开始还以为是floyd,后来和杨烁讨论的时候像是最大生成树,最后好多博客都用变形dijkstra做了,
55~~做的好不爽~~只是码代码~~思想不是自己的额~~就连一成都不是~~55~~路还长啊
变形处:找最大的边,dis的无法到达的边初始化为0,map[][]无法到达的也初始化为0,因为求最大边嘛~~更新的时候只能用 最新最大的边 和 走过来的边两者中最小值去更新
有点网络流的的味道,另外,把cin改成scanf竟然由1700ms变成360ms~~我勒个去~~
program:
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define inf -1000000
int n,mm;
int cas=1;
int m[1002][1002];
int dis[1002];
int flag[1002];
void dijkstra()
{
for(int i=1;i<=n;i++)
m[i][i]=inf;
memset(flag,0,sizeof(flag));
memset(dis,0,sizeof(dis));
flag[1]=1;
for(int i=1;i<=n;i++)
dis[i]=m[1][i];
for(int i=1;i<=n;i++)
{
int max=inf;
int t;
for(int k=1;k<=n;k++)
{
if(flag[k]==0&&dis[k]>max)
{
max=dis[k];
t=k;
}
}
flag[t]=1;
if(t==n)
{
//cout<<"Scenario #"<<cas++<<':'<<endl;
printf("Scenario #%d:\n",cas++);
printf("%d\n\n",max);
//cout<<max<<endl<<endl;
break;
}
for(int k=1;k<=n;k++)
{
if(flag[k]==0&&dis[k]<min(dis[t],m[t][k]))
dis[k]=min(dis[t],m[t][k]);
}
}
}
int main()
{
int test;
//cin>>test;
scanf("%d",&test);
while(test--)
{
memset(m,0,sizeof(m));
scanf("%d%d",&n,&mm);//cin>>n>>mm;
for(int i=1;i<=mm;i++)
{
int a,b,w;
//cin>>a>>b>>w;
scanf("%d%d%d",&a,&b,&w);
m[a][b]=w;
m[b][a]=w;
}
dijkstra();
}
//system("pause");
return 0;
}