本题的意思是Bessie想要通过一篇区域,可是这篇区域有asteroid,现在他用weapon可以一次清除掉一行或者一列的asteroid,现在让你求出Bessie最少可以用weapon几次可以清除掉所有的weapon。题目中给的样例x表示要清楚掉的asteroid,点表示可以通过的区域,很明显Bessie用两次weapon就可以清除掉所有的weapon。
本题所采用的思想就是最大二分匹配,利用匈牙利算法来实现最大二分匹配(至于什么是最大二分匹配,看以看群共享里面的ppt)。这个题目完全可以套用匈牙利算法的模板来实现。
代码如下:
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
const int MAXN=1001;
int N,K,ans;
bool g[MAXN][MAXN];
bool y[MAXN];
int link[MAXN];
bool find(int x);
int main()
{
while(cin>>N>>K)
{
int i,a,b;
memset(g,0,sizeof(g));
memset(link,-1,sizeof(link));
for(i=0;i<K;i++)
{
cin>>a>>b;
g[a][b]=true;
}
ans=0;
for(i=1;i<=N;i++) //v1=v2=N
{
memset(y,0,sizeof(y));
if(find(i)){
ans++;
}
}
cout<<ans<<endl;
}
return 0;
}
bool find(int x)
{
for(int i=1;i<=N;i++)
{
if(g[x][i] && !y[i])
{
y[i]=true;
if(link[i]==-1 || find(link[i]))
{
link[i]=x;
return true;
}
}
}
return false;
}