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;

}

你可能感兴趣的:(poj)