POJ-2112 Optimal Milking(floyd+最大流+二分)
Posted shuaihui520
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ-2112 Optimal Milking(floyd+最大流+二分)相关的知识,希望对你有一定的参考价值。
题目大意:
有k个挤奶器,在牧场里有c头奶牛,每个挤奶器可以满足m个奶牛,奶牛和挤奶器都可以看成是实体,现在给出两个实体之间的距离,如果没有路径相连,则为0,现在问你在所有方案里面,这c头奶牛需要走的最大距离的最小值。
分析:
先将题目给出来的距离矩阵跑一下 Floyd 求出全源最短路方便后面建图,
这里注意一下除了对角线的点若有其他点为 0 则应将其值设置为 INF 代表不可达
在使用最大流判断是否存在解的时候,要对每个解都重新建图。
建图需要一个超级源点,把所有的奶牛与源点相连,容量设置为1
把所有的挤奶器与汇点相连,容量为m
然后对于挤奶器和奶牛的距离不超过判断的解的距离的连边,容量设置为1
然后求解即可。如果最大流 == 牛的总数说明可行
AC代码:
DC.AddEdge(0,k+i,1); for(int i=1 ; i<=k ; i++) DC.AddEdge(i,n,m); for(int i=k+1 ; i<=k+c ; i++) for(int j=1 ; j<=k ; j++) if(mp[i][j]<=mid) DC.AddEdge(i,j,INF); return (DC.Maxflow()==c); } int main( ) { int k,c,m; while(scanf("%d%d%d",&k,&c,&m)!=EOF) { for(int i=1 ; i<=k+c ; i++) for(int j=1 ; j<=k+c ; j++) { scanf("%d",&mp[i][j]); if(i!=j&&mp[i][j]==0) mp[i][j]=INF; } FD(k,c); int ans; while(L<=R) { int mid = (L+R)>>1; if(!ok(mid,k,c,m)) L = mid+1; else { ans=mid; R=mid-1; } } printf("%d ",ans); } return 0; }
以上是关于POJ-2112 Optimal Milking(floyd+最大流+二分)的主要内容,如果未能解决你的问题,请参考以下文章
POJ 2112 Optimal Milking(二分+最大流)
POJ2112:Optimal Milking(Floyd+二分图多重匹配+二分)
Optimal Milking(POJ2112+二分+Dinic)