大概题意:在n*n的矩阵上有k个行星,有一种武器一次可以消去一行或者一列的行星,问最少要用这个武器多少次。
方法:行和列匹配,然后最小点覆盖,即最大匹配。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int map[501][501],vis[501],y[501],n,k;
bool dfs(int i)
{
for(int j=1;j<=n;j++)
{
if(map[i][j]&&!vis[j])
{
vis[j]=1;
if(!y[j]||dfs(y[j]))
{
y[j]=i;
return true;
}
}
}
return false;
}
void match()
{
memset(y,0,sizeof(y));
int i,ans=0;
for(i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
if(dfs(i)) ans++;
}
printf("%d\n",ans);
}
int main()
{
while(scanf("%d%d",&n,&k)!=EOF)
{
int i;
memset(map,0,sizeof(map));
for(i=1;i<=k;i++)
{
int r,c;
scanf("%d%d",&r,&c);
map[r][c]=1;
}
match();
}
return 0;
}