题目描述:
大意就是一个NXN的方格,格子里有一些点,然后一次可以消灭其中一行或者一列,然后问最多要几次才能将其全部消灭;
求解思路:
可以将方格中的点看作(x,y)的集合,将x和y分作两行,每个点对应一条x和y之间的连线,是一个二分图,可以转化为求二分图最大匹配的问题。
用匈牙利算法来求解,最主要的思路还是深搜,加上一个匹配的记忆。
code:
//Asteroids
#include<iostream>
#define N 502
using namespace std;
int x[N];
int y[N];
int a[N][N];
bool vis[N];
int n,k;
bool dfs(int v)
{
for(int i=1;i<=n;i++)
{
if(a[v][i]&&!vis[i])
{
vis[i]=true;
if(y[i]==-1||dfs(y[i]))
{
y[i]=v;
return true;
}
}
}
return false;
}
int main()
{
//freopen("in.txt","r",stdin);
cin>>n>>k;
int c,r;
for(int i=0;i<k;i++)
{
scanf("%d%d",&c,&r);
a[c][r]=1;
}
int count=0;
memset(y,-1,sizeof(y));
for(int i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
if(dfs(i))
count++;
}
cout<<count<<endl;
return 0;
}