POJ2112 Optimal Milking (二分+最大流)
来源:互联网 发布:sqlserver存储过程语法 编辑:程序博客网 时间:2024/06/06 14:08
链接:http://poj.org/problem?id=2112
题意是有K个机器,C头奶牛,每个机器能给M个奶牛挤奶,求奶牛的要走的最大行走距离的最小值。
输入的邻接矩阵是直接相连的距离,要求每个点之间的最短距离要floyd一下。
建图的时候这样考虑,建立一个源点,源点到每头牛的流量是1,二分牛到机器的距离,小于等于这个距离的路径流量++,建立一个汇点,每个机器到汇点的流量=M。
二分牛到机器的距离的时候要注意上界,因为有些路径可能原来不相连,floyd之后相连了,所以上界是200*(K+C),因为一个点可能经过所有(K+C)个点之后才相连,建图完套dinic模板就解决了
代码:
#include<cstdio>#include<cstring>#include<string>#include<queue>#include<map>#include<iostream>#include<vector>#include<cstdlib>#include<cmath>#include<stack>#include<ctime>#include<cctype>#include<algorithm>using namespace std;const int INF=1e9+7;typedef pair<int,int> pii;typedef long long ll;int K,C,M,n,pic[250][250],a[250][250],d[250];void floyd(){ for(int k=1;k<=n;k++){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(pic[i][k]+pic[k][j]<pic[i][j]){ pic[i][j]=pic[i][k]+pic[k][j]; } } } }}bool BFS(){ queue<int> Q; memset(d,-1,sizeof(d)); d[n+1]=0;Q.push(n+1); while(!Q.empty()){ int s=Q.front();Q.pop(); for(int i=0;i<=n+1;i++){ if(a[s][i]>0&&d[i]<0){ d[i]=d[s]+1;Q.push(i); } } } return d[0]>0;}int DFS(int s,int t,int flow){ if(s==t||!flow)return flow; int ans=0; for(int i=0;i<=n+1;i++){ if(d[i]==d[s]+1&&a[s][i]>0){ int ff=DFS(i,t,min(flow,a[s][i])); if(ff){ a[s][i]-=ff; a[i][s]+=ff; ans+=ff; flow-=ff; if(!flow)break; } } } if(ans==0)d[s]=-1; return ans;}int dinic(){ int ans=0; while(BFS()){ ans+=DFS(n+1,0,INF); } return ans;}void build(int len){ memset(a,0,sizeof a); int st=n+1,ed=0; for(int i=1;i<=K;i++){ a[i][ed]=M; } for(int i=K+1;i<=n;i++){ a[st][i]++; } for(int i=1;i<=K;i++){ for(int j=K+1;j<=n;j++){ if(pic[j][i]<=len){ a[j][i]++; } } }}int main(){// freopen("D://input.txt","r",stdin); while(scanf("%d%d%d",&K,&C,&M)!=EOF){ n=K+C; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ scanf("%d",&pic[i][j]); if(!pic[i][j])pic[i][j]=INF; } } floyd(); int low=0,high=n*200,mid,ans=-1; while(low<=high){ //printf("%d %d ",low,high); mid=(low+high)>>1; build(mid); if(dinic()==C){ ans=mid; high=mid-1; } else low=mid+1; } printf("%d\n",ans); }// printf("%.3f\n",(double)clock()/CLOCKS_PER_SEC); return 0;}
0 0
- poj2112 Optimal Milking --- 最大流,二分
- POJ2112 Optimal Milking 【最大流+二分】
- POJ2112 Optimal Milking (二分+最大流)
- Optimal Milking poj2112 二分+最大流
- POJ2112 Optimal Milking—网络流,最大流,二分
- POJ2112 Optimal Milking(最大流+二分答案)
- 【多重二分匹配+网络流】:poj2112,Optimal Milking
- [网络流]poj2112 Optimal Milking
- poj2112 Optimal Milking (Dinic+Floyd+二分)
- poj2112 Optimal Milking dinic/isap+floyed+二分
- poj2112--Optimal Milking(二分多重匹配)
- poj 2112 Optimal Milking 二分+最大流
- poj 2112 Optimal Milking(二分+最大流)
- POJ 2112 Optimal Milking 二分最大流
- poj 2112 Optimal Milking 二分+最大流
- POJ 2112 Optimal Milking【二分+最大流】
- poj 2112 Optimal Milking(二分+最大流)
- POJ 2112 Optimal Milking 二分+最大流
- 欢迎使用CSDN-markdown编辑器
- 超棒的 15 款 Bootstrap UI 编辑器
- 关于spark运行FP-growth算法报错com.esotericsoftware.kryo.KryoException
- Item 12: 把重写函数声明为“override”的
- Item 13: 比起iterator优先使用const_iterator
- POJ2112 Optimal Milking (二分+最大流)
- Gatling官网教程翻译之Simulation Structure
- Linux脚本参数之if fi
- Item 14: 如果函数不会抛出异常就把它们声明为noexcept
- Item 15: 只要有可能,就使用constexpr
- 怎么实现iMindMap视图间的快速切换
- Ugly Windows
- 两个DateTime变量无法相等
- Item 16: 让const成员函数做到线程安全