今天没事做了第一道网络流的题,真是很神奇,可以把各种场景建模成网络流来做
poj3281也一样,先把食物当成源点然后流到奶牛,再从奶牛流到奶牛,再从奶牛到饮料。
#include<iostream>
#include<queue>
#include<vector>
#include<stdio.h>
#include<string.h>
#include<limits.h>
int c[420][420],f[420][420],a[420];
int s=0,t,n,m;
using namespace std;
int ek(int m)
{
queue<int>q;
int i,j,u,v,p[420];
int maxf=0;
while(1)
{
memset(a,0,sizeof(a));
memset(p,0,sizeof(p));
a[s]=INT_MAX;
q.push(s);
while(!q.empty())
{
u=q.front();
q.pop();
// system("pause");
for(v=0;v<=m;v++)
{
if(!a[v]&&c[u][v]>f[u][v])
{
if(a[u]>c[u][v]-f[u][v])
a[v]=c[u][v]-f[u][v];
else
a[v]=a[u];
q.push(v);
p[v]=u;
// system("pause");
}
}
}
if(a[t]==0)break;
for(u=t;u!=s;u=p[u])
{
f[p[u]][u]+=a[t];
f[u][p[u]]-=a[t];
}
maxf+=a[t];
}
return maxf;
}
int main()
{
int i,j,u,v,cap;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(c,0,sizeof(c));
memset(f,0,sizeof(f));
memset(a,0,sizeof(a));
for(i=1;i<=n;i++)
{
c[0][i]=1;
}
for(i=1;i<=n;i++)
{
scanf("%d",&j);
for(int k=0;k<j;k++)
{
scanf("%d",&v);
c[i][v+n]=1;
}
}
t=n+m+1;
for(i=1;i<=m;i++)
{
c[i+n][t]=1;
}
printf("%d\n",ek(n+m+1));
}
}