題目鏈接: poj 1274
題目大意: 給出N頭奶牛,和M個牛棚
每頭奶牛隻在自己喜歡的牛棚產奶,問最大的產牛量
解題思路: 把N頭奶牛作爲X集合,M個牛棚作爲Y集合
奶牛和牛棚的關係就是集合X和集合Y的關係
問題轉化爲 X集合和Y集合的最大匹配數
匈牙利DFS增廣路求解
代碼:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 205
int edge[MAX][MAX],n,m,cx[MAX],cy[MAX],visit[MAX];
int DFS(int u) //匈牙利DFS尋找增廣軌
{
int i;
for(i=1;i<=n;i++)
{
if(!visit[i]&&edge[u][i])
{
visit[i]=1;
if(!cy[i]||DFS(cy[i]))
{
cx[u]=i;
cy[i]=u;
return 1;
}
}
}
return 0;
}
int main()
{
int i,j,sum,a,b;
while(scanf("%d%d",&n,&m)!=EOF)
{
sum=0;
memset(cx,0,sizeof(cx));
memset(cy,0,sizeof(cy));
memset(edge,0,sizeof(edge));
for(i=1;i<=n;i++)
{
scanf("%d",&a);
for(j=1;j<=a;j++)
{
scanf("%d",&b);
edge[i][b]=1; //從X匹配到Y
}
}
for(i=1;i<=n;i++)
{
if(!cx[i])
{
memset(visit,0,sizeof(visit));
sum+=DFS(i); //每次增廣1
}
}
printf("%d\n",sum);
}
}