poj 1797

题目大意是就是何处一个图,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;
}

 

 

 

 

你可能感兴趣的:(poj)