poj Optimal Milking
Optimal Milking
题目:
有K个机器。C仅仅牛。要求求出最全部牛到各个产奶机的最短距离。给出一个C+K的矩阵,表示各种标号间的距离。
而每一个地方最多有M仅仅牛。
算法分析:
二分+最短路+网络流
想法难以想到。我是看解题报告的思路。
然后。自己上了手。開始wrong 了3次。后来各种该。无意的一个更改就AC了。无语勒。
。。。
wrong 在了,网络流建图的时候仅仅能是机器和奶牛之间的距离关系。而奶牛跟奶牛或者机器跟机器不要建边。当时脑残了。!。!
- #include <iostream>
- #include <algorithm>
- #include <vector>
- #include <queue>
- #include <cstdio>
- #include <cstring>
- using namespace std;
- const int INF = 1 << 20;
- const int MAXN = 1000;
- struct Edge{
- int from,to,cap,flow,cost;
- Edge(){};
- Edge(int _from,int _to,int _cap,int _flow)
- :from(_from),to(_to),cap(_cap),flow(_flow){};
- };
- vector<Edge> edges;
- vector<int> G[MAXN];
- int cur[MAXN],d[MAXN];
- bool vst[MAXN];
- int src,sink;
- int dist[MAXN][MAXN];
- int K,C,M,V;
- void init(){
- src = V + 1; sink = src + 1;
- for(int i = 0;i <= sink;++i)
- G[i].clear();
- edges.clear();
- }
- void flody(){
- for(int k = 0;k < V;++k)
- for(int i = 0;i < V;++i)
- for(int j = 0;j < V;++j)
- if(dist[i][j] > dist[i][k] + dist[k][j])
- dist[i][j] = dist[i][k] + dist[k][j];
- // for(int i = 0;i < V;++i){
- // for(int j = 0;j < V;++j)
- // printf("%d ",dist[i][j]);
- // puts("");
- // }
- }
- void addEdge(int from,int to,int cap){
- edges.push_back(Edge(from,to,cap,0));
- edges.push_back(Edge(to,from,0,0));
- int sz = edges.size();
- G[from].push_back(sz - 2);
- G[to].push_back(sz - 1);
- }
- void build(int limit){
- init();
- for(int i = K;i < V;++i){ // 奶牛与源点
- addEdge(src,i,1);
- }
- for(int i = 0;i < K;++i){ //机器与汇点
- addEdge(i,sink,M);
- }
- //注意---> i = K!!! j < K!!!!
- for(int i = K;i < V;++i){ //奶牛与机器的连接
- for(int j = 0;j < K;++j){
- if(dist[i][j] <= limit){
- addEdge(i,j,1);
- }
- }
- }
- }
- bool BFS(){
- memset(vst,0,sizeof(vst));
- queue<int> Q;
- Q.push(src);
- d[src] = 0;
- vst[src] = 1;
- while(!Q.empty()){
- int x = Q.front(); Q.pop();
- for(int i = 0;i < (int)G[x].size();++i){
- Edge& e = edges[G[x][i]];
- if(!vst[e.to] && e.cap > e.flow){
- vst[e.to] = 1;
- d[e.to] = d[x] + 1;
- Q.push(e.to);
- }
- }
- }
- return vst[sink];
- }
- int DFS(int x,int a){
- if(x == sink||a == 0)
- return a;
- int flow = 0,f;
- for(int& i = cur[x];i < (int)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 flow = 0;
- while(BFS()){
- memset(cur,0,sizeof(cur));
- flow += DFS(src,INF);
- }
- return flow;
- }
- bool Check(int mid){
- build(mid);
- int flow = maxFlow(); //cout << "flow : " << flow << endl;
- return flow == C;
- }
- void solve(){
- flody();
- int lb = -1,ub = INF + 100;
- while(ub - lb > 1){
- int mid = (lb + ub) / 2;
- if(Check(mid))
- ub = mid;
- else
- lb = mid;
- //cout << "mid: " << mid << " lb: " << lb << " ub: " << ub << endl;
- }
- printf("%d\n",ub);
- }
- int main()
- {
- // freopen("Input.txt","r",stdin);
- while(~scanf("%d%d%d",&K,&C,&M)){
- V = K + C;
- int x;
- for(int i = 0;i < V;++i){
- for(int j = 0;j < V;++j){
- scanf("%d",&x);
- dist[i][j] = (x == 0 ? INF : x);
- }
- dist[i][i] = 0;
- }
- solve();
- }
- return 0;
- }
另一种是多个匹配,。没有写。成品填充。
版权声明:本文博主原创文章,博客,未经同意不得转载。
poj Optimal Milking的更多相关文章
- POJ 2112 Optimal Milking (二分+最短路径+网络流)
POJ 2112 Optimal Milking (二分+最短路径+网络流) Optimal Milking Time Limit: 2000MS Memory Limit: 30000K To ...
- POJ 2112 Optimal Milking (二分 + floyd + 网络流)
POJ 2112 Optimal Milking 链接:http://poj.org/problem?id=2112 题意:农场主John 将他的K(1≤K≤30)个挤奶器运到牧场,在那里有C(1≤C ...
- POJ 2112—— Optimal Milking——————【多重匹配、二分枚举答案、floyd预处理】
Optimal Milking Time Limit:2000MS Memory Limit:30000KB 64bit IO Format:%I64d & %I64u Sub ...
- Poj 2112 Optimal Milking (多重匹配+传递闭包+二分)
题目链接: Poj 2112 Optimal Milking 题目描述: 有k个挤奶机,c头牛,每台挤奶机每天最多可以给m头奶牛挤奶.挤奶机编号从1到k,奶牛编号从k+1到k+c,给出(k+c)*(k ...
- Optimal Milking 分类: 图论 POJ 最短路 查找 2015-08-10 10:38 3人阅读 评论(0) 收藏
Optimal Milking Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 13968 Accepted: 5044 Case ...
- POJ 2112 Optimal Milking (Dinic + Floyd + 二分)
Optimal Milking Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 19456 Accepted: 6947 ...
- Optimal Milking POJ - 2112 (多重最优匹配+最小费用最大流+最大值最小化 + Floyd)
Optimal Milking Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 19347 Accepted: 690 ...
- POJ2112 Optimal Milking (网络流)(Dinic)
Optimal Milking Time Limit: 2000MS Memory Limit: 30000K T ...
- 题解 最优的挤奶方案(Optimal Milking)
最优的挤奶方案(Optimal Milking) 时间限制: 1 Sec 内存限制: 128 MB 题目描述 农场主 John 将他的 K(1≤K≤30)个挤奶器运到牧场,在那里有 C(1≤C≤20 ...
随机推荐
- rsync Backups for Windows
Transfer your Windows Backups to an rsync server over SSH rsync.net provides cloud storage for offsi ...
- 【ASP.NET Web API教程】5.3 发送HTML表单数据:文件上传与多部分MIME
原文:[ASP.NET Web API教程]5.3 发送HTML表单数据:文件上传与多部分MIME 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本系列教程,请先看前面 ...
- 【ASP.NET Web API教程】6 格式化与模型绑定
原文:[ASP.NET Web API教程]6 格式化与模型绑定 6 Formats and Model Binding 6 格式化与模型绑定 本文引自:http://www.asp.net/web- ...
- java面向对象下:JavaXML解析技术
20.JavaXML解析技术: XML概述: XML可扩展标记性语言,用于数据表达和数据传递. XML语法规则: 合法DTDXML:1.内部DTD(和XML一起):2.外部 ...
- Linux Shell 之 Shell中的函数调用
说起函数调用,相信大家也不会陌生,然而对于初学Shell的我来说,Shell中函数调用方式却有点让我不太习惯,自己也走了不少的弯路,因为传递参数时出了一个很“自然”的错误,也让我吃了不少的苦头,所以总 ...
- Delphi调用C++导出的QT类
打开VS2008创建一个dll项目(创建了一个QT Library项目),新建头文件q4dapplication.h定义纯虚类: #ifndef Q4DAPPLICATION#define Q4DAP ...
- 百度GPSutil
================================================= package com.qcar.benz.biz.common; import com.aliba ...
- 阿录帮帮忙—spring mvc 的hello world
一:web.xml配置 <!-- Spring MVC配置 --> <servlet> <servlet-name>Spring MVC Dispatcher Se ...
- 呜呼!Node.js是什么?
近期看到非常多站点都使用node.js.開始感到非常好奇.就開始推測这是个什么东西,大概就是个js文件吧,所以開始根本 没有在意,可是越感觉就认为越不正确劲,为什么大家都在用它呢?所以我决定搞个明确. ...
- 高逼格UI-ASD(Android Support Design)
绪 今年的Google IO给我们android开发着带来了三样非常屌非常屌的library: ASD(Android Support Design) APL(Android Percent Layo ...