/*
题意就是说从1-n的所有通路中找到一个最大载重量;
运用dijkstar算法进行松弛操作,就是每次找到最大边然后不断的更新;
*/
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
int Minn(int a,int b) { return (a<b)?a:b;}
int Maxx(int a,int b) { return (a>b)?a:b;}///能够写出函数就不要偷懒;
const int inf=1e8+7;
const int maxn=1e3+7;
bool vis[maxn];///看以前的节点是否被访问;
int mmp[maxn][maxn],dis[maxn];///这个dis数组表示从源节点到达这个节点的边的最大值;
int n,m;
void dijkstra()
{
for(int i=1;i<=n;i++)
{
dis[i]=mmp[1][i];
vis[i]=0;
}
dis[1]=0;
for(int i=1;i<=n;i++)
{
int Max=-1,k=-1;
for(int j=1;j<=n;j++)
{
if(!vis[j]&&dis[j]>Max)
{
Max=dis[j];
k=j;
}
}
vis[k]=1;
if(k==-1) break;
for(int j=1;j<=n;j++)
{
/*if(!vis[j]&&d[j]<Minn(d[k],mmp[k][j]))
d[j]=Minn(d[k],mmp[k][j]);*/
if(!vis[j]&&mmp[k][j])///进行松弛操作,找边的最小值,然后进行更新;
{
if(dis[j]<mmp[k][j]&&dis[j]<dis[k]) dis[j]=Minn(dis[k],mmp[k][j]);
}
}
}
}
int main ()
{
int t;
scanf("%d",&t);
for(int cas=1;cas<=t;cas++)
{
scanf("%d %d",&n,&m);
int a,b,c;
memset(mmp,0,sizeof(mmp));
for(int i=1;i<=m;i++)
{
scanf("%d %d %d",&a,&b,&c);
mmp[a][b]=mmp[b][a]=c;
}
dijkstra();
printf("Scenario #%d:\n%d\n\n",cas,dis[n]);
}
return 0;
}
POJ - 1797 Heavy Transportation
最新推荐文章于 2021-05-09 17:16:05 发布