这道题题目大意是就是一个图,n个顶点和m条边,每个边都有最大承载量,现在我要从1点运送货物到n点,求能运送货物的最大重量。(从1到n的某一条路径能运送货物的最大重量是该路径上每一条边中承重量最小的值,即最小边权,那么该题就是求所有路径中的最大的最小边权)
对于数据,第一行为t代表测试数据个数,第二行为n和m(意义见上),接着m行,每行三个整数分别是代表一条边的起点,终点及最大承重量。输出能运送货物的最大重量,格式见样例。注意数据输完后还要再多输一个空行。
对于数据,从1运到3有两种方案:
方案1:1-2-3,其中1-2承重为3,2-3承重为5,则可以运送货物的最大重量是3(当大于3时明显1到不了2)
方案2:1-3,可知1-3承重为4,故此路可运送货物的最大重量是4,故答案输出4
解题思路:其实这个求最大边可以近似于求最短路,只要修改下找最短路更新的条件就可以了。具体看代码:
最坑的是 我开始用的cin cout输入输出,超时了......
#include<stdio.h>
#include<string.h>
int N,M;
int mpt[1005][1005];
int dis[1005];
int vis[1005];
int Min(int a,int b)
{
return a>b?b:a;
}
void Dij() //核心算法
{
int i,j;
for(i=0;i<=N-1;i++)
{
int max=-1;
int u=0;
for(j=1;j<=N;j++)
{
if(!vis[j]&&max<dis[j])
{
max=dis[j];
u=j;
}
}
if(u==0)break;
vis[u]=1;
for(j=1;j<=N;j++)
{
if(!vis[j]&&Min(mpt[u][j],dis[u])>dis[j]) //更新条件的变化
{
dis[j]=Min(dis[u],mpt[u][j]);
}
}
}
}
void Init() //初始化
{
int i,j;
memset(vis,0,sizeof(vis));
for(i=1;i<=N;i++)
{
for(j=1;j<=N;j++)
{
mpt[i][j]=0;
}
}
}
int main()
{
int t;
scanf("%d",&t);
int cnt=0;
while(t--)
{
cnt++;
scanf("%d %d",&N,&M);
int i,j;
Init();
for(i=0;i<M;i++)
{
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
mpt[a][b]=mpt[b][a]=c;
}
for(i=1;i<=N;i++)
{
dis[i]=mpt[1][i]; //这个时候dis不代表从1到n的最短路径,而是最大承载量
}
Dij();
printf("Scenario #%d:\n",cnt);
printf("%d\n\n",dis[N]);
}
return 0;
}