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; }