POJ 2112 Optimal Milking(二分+最大流)
2017-05-31 16:28
369 查看
http://poj.org/problem?id=2112
题意:
现在有K台挤奶器和C头奶牛,奶牛和挤奶器之间有距离,每台挤奶器每天最多为M头奶挤奶,现在要安排路程,使得C头奶牛所走的路程中的最大路程最小。
思路:
很明显的二分题目。
源点和每头牛相连,容量为1。汇点和每台挤奶器相连,容量为M。
接下来每次二分枚举最大距离,然后在图中寻找每一条边,如果小于等于该最大距离,那么就将这条边加入图中,最后判断是否满流即可。
题意:
现在有K台挤奶器和C头奶牛,奶牛和挤奶器之间有距离,每台挤奶器每天最多为M头奶挤奶,现在要安排路程,使得C头奶牛所走的路程中的最大路程最小。
思路:
很明显的二分题目。
源点和每头牛相连,容量为1。汇点和每台挤奶器相连,容量为M。
接下来每次二分枚举最大距离,然后在图中寻找每一条边,如果小于等于该最大距离,那么就将这条边加入图中,最后判断是否满流即可。
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> #include<sstream> #include<vector> #include<stack> #include<queue> #include<cmath> #include<map> using namespace std; typedef long long ll; typedef pair<int,int> pll; const int INF=0x3f3f3f3f3f; const int maxn=500+5; struct Edge { int from,to,cap,flow; Edge(int u,int v,int w,int f):from(u),to(v),cap(w),flow(f){} }; struct Dinic { int n,m,s,t; vector<Edge> edges; vector<int> G[maxn]; bool vis[maxn]; int cur[maxn]; int d[maxn]; void init(int n) { this->n=n; for(int i=0;i<n;++i) G[i].clear(); edges.clear(); } void AddEdge(int from,int to,int cap) { edges.push_back( Edge(from,to,cap,0) ); edges.push_back( Edge(to,from,0,0) ); m=edges.size(); G[from].push_back(m-2); G[to].push_back(m-1); } bool BFS() { queue<int> Q; memset(vis,0,sizeof(vis)); vis[s]=true; d[s]=0; Q.push(s); while(!Q.empty()) { int x=Q.front(); Q.pop(); for(int i=0;i<G[x].size();++i) { Edge& e=edges[G[x][i]]; if(!vis[e.to] && e.cap>e.flow) { vis[e.to]=true; d[e.to]=d[x]+1; Q.push(e.to); } } } return vis[t]; } int DFS(int x,int a) { if(x==t || a==0) return a; int flow=0, f; for(int &i=cur[x];i<G[x].size();++i) { Edge &e=edges[G[x][i]]; if(d[e.to]==d[x]+1 && (f=DFS(e.to,min(a,e.cap-e.flow) ) )>0) { e.flow +=f; edges[G[x][i]^1].flow -=f; flow +=f; a -=f; if(a==0) break; } } return flow; } int Maxflow(int s,int t) { this->s=s; this->t=t; int flow=0; while(BFS()) { memset(cur,0,sizeof(cur)); flow +=DFS(s,0x3f3f3f3f); } return flow; } }DC; int k,c,m; int g[maxn][maxn]; void floyd() { for(int t=1;t<=k+c;t++) for(int i=1;i<=k+c;i++) for(int j=1;j<=k+c;j++) g[i][j]=min(g[i][j],g[i][t]+g[t][j]); } void solve(int dis) { int src=0,dst=k+c+1; DC.init(dst+1); for(int i=1;i<=k;i++) DC.AddEdge(i,dst,m); for(int i=k+1;i<=k+c;i++) DC.AddEdge(src,i,1); for(int i=1;i<=k;i++) { for(int j=k+1;j<=k+c;j++) if(g[i][j]<=dis) DC.AddEdge(j,i,1); } } int main() { //freopen("D:\\input.txt","r",stdin); while(scanf("%d%d%d",&k,&c,&m)!=EOF) { int L=0,R=0; memset(g,0,sizeof(g)); for(int i=1;i<=k+c;i++) { for(int j=1;j<=k+c;j++) { scanf("%d",&g[i][j]); if(g[i][j]==0) g[i][j]=INF; } } floyd(); for(int i=1;i<=k;i++) for(int j=i+1;j<=k+c;j++) if(g[i][j]!=INF) R=max(R,g[i][j]); int ans; while(L<=R) { int mid=(L+R)/2; solve(mid); if(DC.Maxflow(0,k+c+1)==c) {ans=mid;R=mid-1;} else L=mid+1; } printf("%d\n",ans); } return 0; }
相关文章推荐
- poj 2112 Optimal Milking(floyd+二分+最大流)
- POJ 2112 Optimal Milking(二分+最大流)
- POJ 2112--Optimal Milking【二分找最大距离的最小值 && 最大流dinic】
- POJ 2112 Optimal Milking (二分+最短路+最大流or二分图多重匹配)
- POJ 2112 Optimal Milking (二分+最大流/多重匹配) && POJ 2391 Ombrophobic Bovines( 二分+拆点+最大流)
- POJ_2112_Optimal Milking(最大流+二分)
- POJ 2112 Optimal Milking 二分答案+最大流
- POJ 2112 Optimal Milking 最大流 + 二分 + floyd
- poj 2112 Optimal Milking 【最大流 简单题】 【floyd预处理最短路 + 二分 + 最大流】
- 【POJ- 2112】Optimal Milking 【floyd+二分+最大流】
- POJ_2112_Optimal Milking( 二分查找 + Floyd + 最大流EK )
- POJ 2112 Optimal Milking (二分 + 最大流)
- POJ 2112 Optimal Milking(最大流-Dinic+Floyd+二分)
- poj 2112 Optimal Milking(二分+最大流)
- POJ 2112 Optimal Milking【二分+最大流】
- POJ 2112 Optimal Milking(最大流+二分)
- Poj 2112 Optimal Milking【Floyd+二分+最大流Dinic】
- poj 2112 Optimal Milking(spfa+二分+最大流)
- poj 2112 Optimal Milking(最大流,二分,floyd)
- poj 2112 Optimal Milking(二分搜索+最大流)