题目:http://acm.hdu.edu.cn/showproblem.php?pid=1054
分析:二分图最小覆盖=二分图最大匹配,双向图注意别忘了ans>>1
代码:
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
const int Tmax=1505;
int n,ans,s[Tmax];
bool v[Tmax];
vector<int> G[Tmax];
bool dfs(int x)
{
int i,len=G[x].size(),to;
for(i=0;i<len;i++)
{
to=G[x][i];
if(!v[to])
{
v[to]=true;
if(s[to]==-1||dfs(s[to]))
{
s[to]=x;
return true;
}
}
}
return false;
}
int main()
{
int i,u,len,j,vv;
while(scanf("%d",&n)==1)
{
for(i=1;i<=n;i++)
G[i].clear();
for(i=1;i<=n;i++)
{
scanf("%d:(%d)",&u,&len);
for(j=1;j<=len;j++)
{
scanf("%d",&vv);
G[u].push_back(vv);
G[vv].push_back(u);
}
}
ans=0;
memset(s,-1,sizeof(s));
for(i=0;i<n;i++)
{
memset(v,0,sizeof(v));
if(dfs(i)) ans++;
}
printf("%d\n",ans>>1);
}
return 0;
}