hdu 2063(最大匹配数)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2063
二分匹配水题,求最大匹配数(即求边数最多的匹配),匈牙利算法实现。。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream> 2 const int MAXN=507; 3 using namespace std; 4 int k,m,n; 5 int map[MAXN][MAXN]; 6 int cx[MAXN],cy[MAXN]; 7 int mark[MAXN]; 8 9 int dfs(int u){ 10 for(int v=0;v<n;v++){ 11 if(map[u][v]&&!mark[v]){ 12 mark[v]=1; 13 if(cy[v]==-1||dfs(cy[v])){ 14 cx[u]=v; 15 cy[v]=u; 16 return 1; 17 } 18 } 19 } 20 return 0; 21 } 22 23 int MaxMatch(){ 24 int res=0; 25 memset(cx,-1,sizeof(cx)); 26 memset(cy,-1,sizeof(cy)); 27 for(int i=0;i<=m;i++){ 28 if(cx[i]==-1){ 29 memset(mark,0,sizeof(mark)); 30 res+=dfs(i); 31 } 32 } 33 return res; 34 } 35 36 37 int main(){ 38 while(~scanf("%d",&k)&&k){ 39 scanf("%d%d",&m,&n); 40 int x,y; 41 memset(map,0,sizeof(map)); 42 for(int i=0;i<k;i++){ 43 scanf("%d%d",&x,&y); 44 map[x-1][y-1]=1;//这里只需单向就行了,因为dfs是就是从X集合的未盖点出发的 45 } 46 int ans=MaxMatch(); 47 printf("%d\n",ans); 48 } 49 return 0; 50 } 51 52 53 54