poj 3281

#include<iostream>
#include<fstream>
#include<queue>

using namespace std;

int n,f,d;

struct e{
    int data;
    int c,f;
    e *next;
    e *opt;
};

e edge[500];
int total;

int h[500];

int build(){
    int i,j,k;
    memset(h,0,sizeof(h));
    queue<int> q;
    q.push(0);
    h[0]=1;
    while(!q.empty())
    {
        i=q.front();
        q.pop();
        e *p=edge[i].next;
        while(p)
        {
            if(p->c>p->f&&h[p->data]==0)
            {
                h[p->data]=h[i]+1;
                if(p->data==total) return 1;
                q.push(p->data);
            }
            p=p->next;
        }
    }
    return 0;
}

int dinic(int s,int minn){
    int i,j,k;
    if(s==total) return minn;
    e *p=edge[s].next;
    while(p)
    {
        if(p->c>p->f&&h[p->data]==h[s]+1)
        {
            i=dinic(p->data,min(minn,p->c-p->f));
            if(i!=-1)
            {
                p->f+=i;
                p->opt->f=-1*p->f;
                return i;
            }
        }
        p=p->next;
    }
    return -1;
}

void solve(){
    int i,j,k;
    int flow=0;
    while(build())
    {
        flow+=dinic(0,10000000);
    }
    cout<<flow<<endl;
}


void add(int s,int t,int w){
    e *p=new e;
    p->data=t;
    p->c=w;
    p->f=0;
    p->next=edge[s].next;
    edge[s].next=p;

    e *q=new e;
    q->data=s;
    q->c=q->f=0;
    q->next=edge[t].next;
    edge[t].next=q;

    p->opt=q;
    q->opt=p;
}

void read(){
//    ifstream cin("in.txt");
    int i,j,k,s,t;
    cin>>n>>f>>d;
    for(i=1;i<=f;i++)
        add(0,i,1);
    total=2*n+f+d+1;
    for(i=1;i<=d;i++)
        add(i+2*n+f,total,1);
    for(i=1+f;i<=n+f;i++)
        add(i,i+n,1);

    for(i=1;i<=n;i++)
    {
        cin>>j>>k;
        for(s=1;s<=j;s++)
        {
            cin>>t;
            add(t,i+f,1);
        }
        for(s=1;s<=k;s++)
        {
            cin>>t;
            add(i+f+n,2*n+f+t,1);
        }
    }
    solve();
}

int main(){
    read();
    return 0;
}

posted on 2011-05-29 10:47  宇宙吾心  阅读(344)  评论(0)    收藏  举报

导航