题目:http://poj.org/problem?id=3041
分析:(x,y)位置有点,则必从x或y消,所以xy连一条边。求此图的最大覆盖,又“最大覆盖==最大匹配”,所以只用求出最大匹配就是答案。
代码:
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
const int Tmax=505;
int n,k,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]==0||dfs(s[to]))
{
s[to]=x;
return true;
}
}
}
return false;
}
int main()
{
int i,x,y;
scanf("%d%d",&n,&k);
for(i=1;i<=k;i++)
{
scanf("%d%d",&x,&y);
G[x].push_back(y);
}
for(i=1;i<=n;i++)
{
memset(v,0,sizeof(v));
if(dfs(i)) ans++;
}
printf("%d",ans);
return 0;
}