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;
}
#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;
}
 
                    
                 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号