poj 3308 Paratroopers

http://poj.org/problem?id=3308

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
#define maxn 10000
using namespace std;

const int inf=1<<30;
int n,m,l,x,y;
double c,f;
double cap[200][200],flow[200][200];
int p[200];
double a[200];

void EK(int s)
{
   queue<int>q;
   memset(flow,0,sizeof(flow));
   f=0;
   for(; ;)
   {
       memset(a,0,sizeof(a));
       memset(p,-1,sizeof(p));
       a[s]=inf;
       q.push(s);
       while(!q.empty())
       {
           int u=q.front();
           q.pop();
           for(int v=0; v<=m+n+1; v++)
           {
               if(!a[v]&&cap[u][v]>flow[u][v])
               {
                   p[v]=u;
                   q.push(v);
                   a[v]=min(a[u],cap[u][v]-flow[u][v]);
               }
           }
       }
       if(a[m+n+1]==0) break;
       for(int u=m+n+1; u!=0; u=p[u])
       {
           flow[p[u]][u]+=a[m+n+1];
           flow[u][p[u]]-=a[m+n+1];
       }
       f+=a[m+n+1];
   }
}

int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        memset(cap,0,sizeof(cap));
        scanf("%d%d%d",&m,&n,&l);
        for(int i=1;i<=m; i++)
        {
            scanf("%lf",&c);
            cap[0][i]=log(c);
        }
        for(int i=m+1; i<=m+n; i++)
        {
            scanf("%lf",&c);
            cap[i][m+n+1]=log(c);
        }
        for(int i=0; i<l; i++)
        {
            scanf("%d%d",&x,&y);
            cap[x][m+y]=inf;
        }
        f=0;
        EK(0);
        printf("%.4f\n",exp(f));
    }
    return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章