http://poj.org/problem?id=3041
首先这个题目求的是二分图的最小点覆盖,二分图的最小点覆盖等于二分图的最大匹配。
因为行与行没关系,列于列也没关系,但行和列之间有关系;
所以这个题目转换为行列之间的二分图的最大匹配
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
vector<int>s[505];
int vis[505];
int match[505];
int find(int u)
{
for(int i=0;i<s[u].size();i++)
{
int temp=s[u][i];
if(vis[temp]==0)
{
vis[temp]=1;
if(match[temp]==-1||find(match[temp]))
{
match[temp]=u;
return 1;
}
}
}
return 0;
}
int pipei(int n)
{
int sum=0;
for(int i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
if(find(i))
{
sum++;
}
}
return sum;
}
int main()
{
int n,k,t;
int a,b,c;
scanf("%d%d",&n,&k);
memset(match,-1,sizeof(match));
for(int i=0;i<=n;i++)
{
s[i].clear();
}
for(int i=0;i<k;i++)
{
scanf("%d%d",&b,&c);
s[b].push_back(c);
}
printf("%d\n",pipei(n));
}