题目大意是就是何处一个图,n个顶点和m条边,每个边都有最大承载量,现在我要从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
解题思路:这道题其实就是一个最短路径的变形问题,不同的而是最短路径求的是路径上所有权重之和,而这道题目求得是路径上最先的权重值,就是变形而已。
具体解释详见代码:
#include<stdio.h>
int net[1005][1005];
int dis[1005],flag[1005];
int n,m;
int min(int a,int b)
{
return a<b?a:b;
}
void Dijkstra()
{
int i,j,w;
int max;
dis[0]=0;
for(i=1;i<n;i++)
{
dis[i]=net[0][i];
flag[i]=0;
}//初始化
flag[0]=1;
for(i=0;i<n-1;i++)
{
max=0;
w=0;
for(j=1;j<n;j++)
{
if(flag[j]==0 && dis[j]>max)
{
w=j;
max=dis[j];
}
}//找出第一个比较大的权重
if(w==0)
break;
flag[w]=1;
for(j=1;j<n;j++)
{
if(flag[j]==0 && dis[j]<min(dis[w],net[w][j]))
dis[j]=min(dis[w],net[w][j]);
}//在路径上更新权重,不同于传统的Dis传统得为权重之和
}
}
int main()
{
int i,j;
int count;
int u,v,dist,Case;
scanf("%d",&count);
for(Case=1;Case<=count;Case++)
{
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
net[i][j]=0;
}//初始化图
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&dist);
net[u-1][v-1]=dist;
net[v-1][u-1]=dist;
}//构建图
Dijkstra();
printf("\nScenario #%d:\n%d\n\n",Case,dis[n-1]);
}
return 0;
}