如下图所示方式构图,每条边的容量为1,则从source到sink最大流量就等于cow与stall的最大匹配
代码:
#include<cstdio>
#include<queue>
#define MAX 410
using namespace std;
FILE *in,*out;
int map[MAX][MAX],nodes,ans,layer[MAX];
bool table[MAX];
void flow(void);
bool BFS(void);
void DFS(int *path,int index);
int main()
{
in=fopen("stall4.in","r");
out=fopen("stall4.out","w");
int n,m,e,id;
fscanf(in,"%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
fscanf(in,"%d",&e);
for(int j=0;j<e;j++)
{
fscanf(in,"%d",&id);
map[i][id+n]=1;
}
}
nodes=n+m+2;
for(int i=1;i<=n;i++) map[0][i]=1;
for(int i=1;i<=m;i++) map[n+i][nodes-1]=1;
flow();
fprintf(out,"%d\n",ans);
fclose(in);
fclose(out);
return 0;
}
void flow(void)
{
int path[MAX];
while(BFS())
{
for(int i=0;i<nodes;i++) table[i]=false;
path[0]=0;
table[0]=true;
DFS(path,0);
}
}
bool BFS(void)
{
queue <int> myqueue;
for(int i=1;i<=nodes;i++) layer[i]=MAX;
layer[0]=0;
myqueue.push(0);
while(!myqueue.empty())
{
int p=myqueue.front();
myqueue.pop();
for(int i=1;i<nodes;i++)
{
if(map[p][i]>0 && layer[i]>layer[p]+1)
{
layer[i]=layer[p]+1;
myqueue.push(i);
}
}
}
if(layer[nodes-1]<MAX) return true;
return false;
}
void DFS(int *path,int index)
{
int pid=path[index];
if(pid==nodes-1)
{
int _min=100000;
for(int i=1;i<=index;i++)
{
if(map[path[i-1]][path[i]]<_min) _min=map[path[i-1]][path[i]];
}
ans+=_min;
for(int i=1;i<=index;i++)
{
map[path[i-1]][path[i]]-=_min;
map[path[i]][path[i-1]]+=_min;
}
return ;
}
for(int i=1;i<nodes;i++)
{
if(map[pid][i]>0 && table[i]==false && layer[i]>layer[pid])
{
path[index+1]=i;
table[i]=true;
DFS(path,index+1);
table[i]=false;
}
}
}