poj 1797
大致题意:求s到t的可行路径上最小值的最大值(有点拗口啊)也就是说从s到t的每一条可行路径上都有一条最小值,有多条路径的话就求这些最小值的最大值。
思路:用求最短路的方法来求解,我们可以把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;
}
浙公网安备 33010602011771号