POJ3308_Paratroopers(最大流最小割)

来源:互联网 发布:java软件license破解 编辑:程序博客网 时间:2024/05/21 20:26

原题地址:点击打开链接

#include<stdio.h>#include<queue>#include<math.h>#include<string.h>using namespace std;#define MAX 99999double min(double x,double y){return x<y?x:y;}double map[110][110];int pos[110];int cheng[110];          bool bfs(int s,int t){int i;memset(cheng,-1,sizeof(cheng));queue<int>que;que.push(s);cheng[s]=0;while(!que.empty()){int u=que.front();que.pop();for(i=0;i<=t;i++){if(map[u][i]>0&&cheng[i]==-1){cheng[i]=cheng[u]+1;que.push(i);}}}if(cheng[t]!=-1)return true;return false;}double dfs(int u,int t,double f){if(u==t)return f;for(int &i=pos[u];i<=t;i++){if(map[u][i]>0 && cheng[u]==cheng[i]-1){double d=dfs(i,t,min(f,map[u][i]));if(d>0){map[u][i]-=d;map[i][u]+=d;return d;}}}return 0;}double max_flow(int s,int t){double res=0;while(bfs(s,t)){memset(pos,0,sizeof(pos));while(true){double d=dfs(s,t,MAX);if(d<=0)break;res+=d;}}return exp(res);}int main(){int i,j,c,m,n,l,s,t,u,v;double cost;scanf("%d",&c);while(c--){scanf("%d%d%d",&m,&n,&l);s=0;t=m+n+1;memset(map,0,sizeof(map));for(i=1;i<=m;i++){scanf("%lf",&cost);map[s][i]=log(cost);}for(i=1;i<=n;i++){scanf("%lf",&cost);map[m+i][t]=log(cost);}for(i=1;i<=l;i++){scanf("%d%d",&u,&v);map[u][m+v]=MAX;}double res=max_flow(s,t);printf("%0.4lf\n",res);}return 0;}


0 0