标签:
题意:在一个n*n的矩阵中有m个点,每次消去一行或一列中的点,求最少的操作次数;
思路:将X轴与Y轴看做两个不同的集合,每行或每列看做一个点,每个给定的点看做一条边,这样二分图就建好了;
消去所有点,即将矩阵完全覆盖,这样就转为了最小点覆盖问题;
最小覆盖数=最大匹配数,因此所需求的为最大匹配数;
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; int t,n,m,shu; int mm[505][505]; int vis[500010],link[500010]; int dfs(int x) { int i,j,k; for(i=1;i<=n;i++) { if(!vis[i]&&mm[x][i]) { vis[i]=1; if(link[i]==-1||dfs(link[i])) { link[i]=x; return 1; } } } return 0; } int hungary() { int i,j,k; int sum=0; memset(link,-1,sizeof(link)); for(i=1;i<=n;i++) { memset(vis,0,sizeof(vis)); if(dfs(i)) sum++; } return sum; } int main() { int i,j,k,u,v; while(scanf("%d%d",&n,&m)!=EOF) { memset(mm,0,sizeof(mm)); for(i=0;i<m;i++) { scanf("%d%d",&u,&v); mm[u][v]=1; } printf("%d\n",hungary()); } return 0; }
标签:
原文地址:http://www.cnblogs.com/dominating/p/4659399.html