POJ_2112 二分图多重匹配
Posted kongbursi-2292702937
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ_2112 二分图多重匹配相关的知识,希望对你有一定的参考价值。
题意:
//题意就是给你k个挤奶池和c头牛,每个挤奶池最多可以来m头牛,而且每头牛距离这k这挤奶池
//有一定的距离,题目上给出k+c的矩阵,每一行代表某一个物品距离其他物品的位置
//这里要注意给出的某头牛和某个挤奶池的距离有可能不是最短的,所以这里要用最短路
//来找出来某个物品到其他物品的最小距离,题目上要求出来在满足每头牛都能到达挤奶池的情况下
//使所有牛中到达挤奶池中的最大值尽量小
//全部处理完之后这就是一个二分图多重匹配问题
代码:
1 #include<algorithm> 2 #include<string.h> 3 #include<stdio.h> 4 const int INF=0x3f3f3f3f; 5 using namespace std; 6 int n,m,k; 7 int g[300][300],mpp[300][300]; 8 int link[35][20],sum[35],used[35]; 9 void floy() 10 11 for(int k=1; k<=n+m; k++) 12 13 for(int i=1; i<=n+m; i++) 14 15 for(int j=1; j<=n+m; j++) 16 17 if(g[i][j]>g[i][k]+g[k][j]) 18 g[i][j]=g[i][k]+g[k][j]; 19 20 21 22 23 int dfs_solve(int u) 24 25 for(int i=1; i<=n; i++) 26 27 if(mpp[u][i]&&!used[i]) 28 29 used[i]=1; 30 if(link[i][0]<sum[i]) 31 32 link[i][++link[i][0]]=u; 33 return true; 34 35 for(int j=1; j<=sum[i]; j++) 36 37 if(dfs_solve(link[i][j])) 38 39 link[i][j]=u; 40 return true; 41 42 43 44 45 return false; 46 47 int hungran() 48 49 int ans=0; 50 for(int i=1; i<=n; i++) 51 link[i][0]=0; 52 for(int i=1; i<=n; i++) 53 sum[i]=k; 54 for(int i=n+1; i<=n+m; i++) 55 56 memset(used,0,sizeof(used)); 57 if(dfs_solve(i)) ans++; 58 59 return ans==m; 60 61 int main() 62 63 while(~scanf("%d%d%d",&n,&m,&k)) 64 65 for(int i=1; i<=n+m; i++) 66 67 for(int j=1; j<=n+m; j++) 68 69 scanf("%d",&g[i][j]); 70 if(g[i][j]==0) 71 g[i][j]=INF; 72 73 74 for(int i=1; i<=n+m; i++) 75 g[i][i]=0; 76 floy(); 77 int l=1,r=INF,mid;//题意明明是200是最大距离,可是这里换到210还是错。 78 //r还是得开到inf...... 79 while(l<=r) 80 81 memset(mpp,0,sizeof(mpp)); 82 mid=(l+r)>>1; 83 for(int i=n+1; i<=n+m; i++) 84 85 for(int j=1; j<=n; j++) 86 87 if(g[i][j]<=mid) 88 mpp[i][j]=1; 89 90 91 if(hungran()) 92 r=mid-1; 93 else 94 l=mid+1; 95 96 printf("%d\n",l); 97 98
以上是关于POJ_2112 二分图多重匹配的主要内容,如果未能解决你的问题,请参考以下文章
POJ2112:Optimal Milking(Floyd+二分图多重匹配+二分)
POJ3189_Steady Cow Assignment(二分图多重匹配/网络流+二分构图)
POJ2584_T-Shirt Gumbo(二分图多重最大匹配/最大流)
POJ3189 Steady Cow Assignment —— 二分图多重匹配/最大流 + 二分