题目链接:http://poj.org/problem?id=3041
题意:给出一个矩阵n*n的矩阵,有m个地方有障碍物,我们可以消去一列或者一行的障碍物,问最小要消去几次
思路: 利用行和列作为点来建立二分图,每有一个障碍物就把该障碍物的行和列连在一起,然做用匈牙利算法求最大匹配就可以了,我对这个图的理解是,一行连接着若干个列,如果该行被消除了,连接的列上的障碍物就被清除了
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
int G[530][530],n;
int list[530],vis[530];
int find(int u)
{
for (int i=1;i<=n;i++)
{
if (vis[i]==0 && G[u][i])
{
vis[i]=1;
if (list[i]==-1 || find(list[i]))
{
list[i]=u;
return 1;
}
}
}
return 0;
}
int solve()
{
int sum=0;
for (int i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
if (find(i)) sum++;
}
return sum;
}
int main()
{
int m;
while (scanf("%d%d",&n,&m)!=EOF)
{
memset(list,-1,sizeof(list));
memset(G,0,sizeof(G));
for (int i=0;i<m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
G[x][y]=1;;
}
int res=solve();
printf("%d\n",res);
}
}