标签:
题意:n*n的格子里面有k个小行星,每一能消除一行或一列,那么最小消除多少次可以把全部消除掉
思路:把行和列连到一起,可以构成一个二分图,那么只需要求最大匹配数即为所求
<pre name="code" class="cpp">#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=1001;
int n1,n2,k;
int mp[N][N],vis[N],link[N];
int dfs(int x)
{
int i;
for(i=1; i<=n2; i++)
{
if(!mp[x][i]&&!vis[i])
{
vis[i]=1;
if(link[i]==-1||dfs(link[i]))
{
link[i]=x;
return 1;
}
}
}
return 0;
}
int main()
{
int i,x,y,s;
int cas = 0;
while(~scanf("%d%d",&n1,&k)){
s=0;
n2=n1;
for(int i=1;i<=n1;i++){
for(int j=1;j<=n2;j++){
mp[i][j]=1;
}
}
for(i=0; i<k; i++)
{
scanf("%d%d",&x,&y);
mp[x][y]=0;
}
memset(link,-1,sizeof(link));
for(i=1; i<=n1; i++)
{
memset(vis,0,sizeof(vis));
if(dfs(i))
s++;
}
printf("%d\n",s);
}
return 0;
}版权声明:都是兄弟,请随意转载,请注明兄弟是谁
标签:
原文地址:http://blog.csdn.net/u013076044/article/details/46954707