poj 1797

大致题意:求st的可行路径上最小值的最大值(有点拗口啊)也就是说从st的每一条可行路径上都有一条最小值,有多条路径的话就求这些最小值的最大值。

思路:用求最短路的方法来求解,我们可以把flow[]数组用于存储源点到当前点的可行的最大载重量,假如a->b权值为c的话,怎么改松弛条件呢?k=(flow[a]<c) ? flow[a] : c; if(flow[b]<k) flow[b]=k;这就保证了到达某个点的最大载重量。

#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
#define MAX_INT 1234567890
struct node
{
	int v;
	int value;
	//int opposite;
	int next;
};
node edge[1000000];
queue <int> Q; 
int flow[1001],head[1001],visit[1001],N;
int add(int s,int t,int w)
{
	edge[N].v=t; edge[N].value=w;
	edge[N].next=head[s];
	return N++;
}
int spfa(int n)
{
	int i,j,k,e,max_flow=0;
	for(i=1;i<=n;i++) flow[i]=0;
	Q.push(1); visit[1]=1;
	flow[1]=MAX_INT;
	while(!Q.empty())
	{
		e=Q.front(),Q.pop();
		visit[e]=0;
		for(i=head[e];i;i=edge[i].next)
		{
			j=edge[i].v;
			k=(flow[e]<edge[i].value) ? flow[e]:edge[i].value;
			if(flow[j]<k)
			{
				flow[j]=k;
				if(!visit[j])
				{
				    Q.push(j);
				    visit[j]=1;
				}
			}
		}
	}
	return flow[n];
}
int main()
{
    int i,m,n,s,w,t,count=0,Case;
	scanf("%d",&Case);
	while(Case--)
	{
		count++; scanf("%d%d",&n,&m);
		memset(head,0,sizeof(head));
		for(N=1,i=0;i<m;i++)
		{
			scanf("%d%d%d",&s,&t,&w);
			head[s]=add(s,t,w);
			head[t]=add(t,s,w);
		}
        printf("Scenario #%d:\n%d\n\n",count,spfa(n));
	}
	return 0;
}
posted @ 2011-08-22 08:33  书山有路,学海无涯  阅读(960)  评论(0编辑  收藏  举报