POJ 3041 Asteroids(最大二分匹配)

//二分图最大匹配(匈牙利算法) //行列匹配,按照题目意思是求最小点覆盖 //根据图论知识,最大匹配数等于最小点覆盖,因此将问题直接转化为二分图最大匹配来处理 #include<iostream> #include<cstring> using namespace std; const int MAXN = 505; bool g[MAXN][MAXN]; bool check[MAXN];//检查数组 int uMatch[MAXN],vMatch[MAXN],U,V; bool findPath(int u)//寻找增广路 { for(int v = 1;v <= V;++v)//这里的编号是从1开始 { if(!check[v] && g[u][v]) { check[v] = 1; if(vMatch[v] == -1 || findPath(vMatch[v]))//如果v未被匹配活着v找到新的增广路 { vMatch[v] = u; uMatch[u] = v;//记录匹配情况 return true; } } } return false; } int maxMatch()//返回最大匹配数 { int ans = 0; for(int u = 1;u <= U;++u)//注意编号的不同 { memset(check,0,sizeof(check)); if(findPath(u)) ++ans; } return ans; } int main() { freopen("in.txt","r",stdin); int n,k,u,v; memset(g,0,sizeof(g)); memset(vMatch,-1,sizeof(vMatch)); memset(uMatch,-1,sizeof(uMatch)); scanf("%d%d",&U,&k); V = U; for(int i = 0;i < k;++i) { scanf("%d%d",&u,&v); g[u][v] = 1; } printf("%d/n",maxMatch()); return 0; } 

你可能感兴趣的:(算法)