EOJ 2096

来源:互联网 发布:闲鱼网淘宝 编辑:程序博客网 时间:2024/05/01 14:49
题目描述:

大意就是一个NXN的方格,格子里有一些点,然后一次可以消灭其中一行或者一列,然后问最多要几次才能将其全部消灭;

求解思路:

可以将方格中的点看作(x,y)的集合,将x和y分作两行,每个点对应一条x和y之间的连线,是一个二分图,可以转化为求二分图最大匹配的问题。

用匈牙利算法来求解,最主要的思路还是深搜,加上一个匹配的记忆。

code:

//Asteroids#include<iostream>#define N 502using 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;}



0 0