| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 14371 | Accepted: 7822 |
Description
Input
Output
Sample Input
3 4 1 1 1 3 2 2 3 2
Sample Output
2
Hint
匈牙利算法!!!!
主要是要懂得将问题转化。
将行列转化为二分两个集合,然后坐标点(i,j)即化为i行j列能够匹配,最后找出最少的覆盖点,由匈牙利定理:最少覆盖点=最大匹配边 。
如果还是不懂可以参考这里点击打开
AC代码如下:
#include<iostream>
#include<cstring>
using namespace std;
int v[505],s[505],map[505][505];
int n,m;
int xyl(int a)
{
int i;
for(i=1;i<=n;i++)
{
if(!v[i]&&map[a][i])
{
v[i]=1;
if(!s[i]||xyl(s[i]))
{
s[i]=a;
return 1;
}
}
}
return 0;
}
int main()
{
int i,j;
int a,b;
while(cin>>n>>m)
{
memset(s,0,sizeof s);
for(i=1;i<=m;i++)
{
cin>>a>>b;
map[a][b]=1;
}
int sum=0;
for(i=1;i<=n;i++)
{
memset(v,0,sizeof v);
if(xyl(i))
sum++;
}
cout<<sum<<endl;
}
return 0;
}
POJ 3041 Asteroids,布布扣,bubuko.com
原文地址:http://blog.csdn.net/hanhai768/article/details/37650409