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的更多相关文章

  1. POJ 2112 Optimal Milking (二分+最短路径+网络流)

    POJ  2112 Optimal Milking (二分+最短路径+网络流) Optimal Milking Time Limit: 2000MS   Memory Limit: 30000K To ...

  2. POJ 2112 Optimal Milking (二分 + floyd + 网络流)

    POJ 2112 Optimal Milking 链接:http://poj.org/problem?id=2112 题意:农场主John 将他的K(1≤K≤30)个挤奶器运到牧场,在那里有C(1≤C ...

  3. POJ 2112—— Optimal Milking——————【多重匹配、二分枚举答案、floyd预处理】

    Optimal Milking Time Limit:2000MS     Memory Limit:30000KB     64bit IO Format:%I64d & %I64u Sub ...

  4. Poj 2112 Optimal Milking (多重匹配+传递闭包+二分)

    题目链接: Poj 2112 Optimal Milking 题目描述: 有k个挤奶机,c头牛,每台挤奶机每天最多可以给m头奶牛挤奶.挤奶机编号从1到k,奶牛编号从k+1到k+c,给出(k+c)*(k ...

  5. Optimal Milking 分类: 图论 POJ 最短路 查找 2015-08-10 10:38 3人阅读 评论(0) 收藏

    Optimal Milking Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 13968 Accepted: 5044 Case ...

  6. POJ 2112 Optimal Milking (Dinic + Floyd + 二分)

    Optimal Milking Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 19456   Accepted: 6947 ...

  7. Optimal Milking POJ - 2112 (多重最优匹配+最小费用最大流+最大值最小化 + Floyd)

      Optimal Milking Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 19347   Accepted: 690 ...

  8. POJ2112 Optimal Milking (网络流)(Dinic)

                                             Optimal Milking Time Limit: 2000MS   Memory Limit: 30000K T ...

  9. 题解 最优的挤奶方案(Optimal Milking)

    最优的挤奶方案(Optimal Milking) 时间限制: 1 Sec  内存限制: 128 MB 题目描述 农场主 John 将他的 K(1≤K≤30)个挤奶器运到牧场,在那里有 C(1≤C≤20 ...

随机推荐

  1. 14.2.5.6 Adaptive Hash Indexes 自适应Hash Indexes

    14.2.5.6 Adaptive Hash Indexes 自适应Hash Indexes adaptive hash index(AHI) 让InnoDB 执行更加像在一个内存数据库里在, 在不牺 ...

  2. VMware Workstation(虚拟机软件) V10.0 简体中文版可以安装了

    在虚拟机软件中VMware Workstation算是一款非常强大较稳定的软件了,今天 VMware Workstation 10.0正式发布了,最让人欣喜的是该版本终于有了简体中 文版了,从现在开始 ...

  3. Ubuntu下Chromium源码的编译

    一.失败的经历 印象中,谷歌建议Ubuntu建议版本为10.4.但是我找不到出处了,模糊的印象.不知道是不是这样? 1.Ubuntu10.4.3-desktop-amd64 + Virtual Box ...

  4. Hawk-数据抓取工具

    Hawk-数据抓取工具:简明教程   Hawk: Advanced Crawler& ETL tool written in C#/WPF 1.软件介绍 HAWK是一种数据采集和清洗工具,依据 ...

  5. Struts2 后台action接收 jsp页面中checkbox中的值

    如前端页面jsp中的标签为: <form action="myurl"> <input type="checkbox" name=" ...

  6. 【iOS开发-76】Private Contacts案例:导航控制器使用、数据传递、第三方类库使用、tableViewCell的加入删除、数据存储等

    (1)效果 (2)源码与第三方类库下载 http://download.csdn.net/detail/wsb200514/8155979 (3)总结 --导航控制器,能够直接用代码的push和pop ...

  7. HDU 3699 A hard Aoshu Problem (暴力搜索)

    题意:题意:给你3个字符串s1,s2,s3;要求对三个字符串中的字符赋值(同样的字符串进行同样的数字替换), 替换后的三个数进行四则运算要满足左边等于右边.求有几种解法. Sample Input 2 ...

  8. 如何不屏蔽Android系统的返回按键

    比如: 第一种方法: public boolean onKeyDown(int keyCode, KeyEvent event) {         // TODO Auto-generated me ...

  9. Android -&gt; 怎样避免Handler引起内存泄露

    很多其它内容,可訪问个人博客www.liangfeizc.com 错误代码 假设在Activiy中通过内部类(Runnable)的方式定义了一个变量runnable, final Runnable r ...

  10. JavaScript RegExp对象

    一.什么是RegExp         1.RegExp 是正則表達式的缩写. 2.当您检索某个文本时,能够使用一种模式来描写叙述要检索的内容.RegExp 就是这样的模式. 3.简单的模式能够是一个 ...