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 ...
随机推荐
- [置顶] 小伙伴们来自己实现LinkedList
继前面实现ArrayList后,今天和小伙伴一起实现LinkedList,LinkedList实现我们采用双向链表来实现,在每次查找时候,如果该查找元素位于该链表的前半段,则从开始检索,如果位于链表的 ...
- Effective C++:规定12:不要忘了复制的对象时,它的每一个组成部分
(一个) 继承制度的声明: class Date {...}; class Customer { public: ... private: string name; Date lastTransact ...
- Delphi5的System.pas只有11514行
Delphi5的System.pas只有11514行(不包含update2),是研究RTL的好材料 相比之下,Delphi6的System.pas只有18118行Delphi7的System.pas只 ...
- linux下 文件IO 相关
linux下操作文件或设备,需要一个文件描述符 file descriptor,fd 来引用.fd是一个非负整数,实际上是一个索引值,指向文件的记录表,对文件的操作都需要fd.默认的几个:标准输入流 ...
- 《转》Linux网络编程入门
原地址:http://www.cnblogs.com/duzouzhe/archive/2009/06/19/1506699.html (一)Linux网络编程--网络知识介绍 Linux网络编程-- ...
- thinkPHP 输出及其模板调用(三)
原文:thinkPHP 输出及其模板调用(三) ThinkPHP 的输出(重点) a.通过 echo 等PHP原生的输出方式在页面中输出 b.通过display方法输出(thinkphp\Home\L ...
- ios 上拉载入下拉刷新Dome
为练手写了一个小的上拉载入很多其它下拉刷新的小的Dome . 没有太多的技术含量,仅仅是作为新手的启示用.是上一篇下拉载入的扩展.先看一下那个再看这个就easy非常多. Dome下载:http://d ...
- 盒子游戏(The Seventh Hunan Collegiate Programming Contest)
盒子游戏 有两个相同的盒子,其中一个装了n个球,另一个装了一个球.Alice和Bob发明了一个游戏,规则如下:Alice和Bob轮流操作,Alice先操作.每次操作时,游戏者先看看哪个盒子里的球的数目 ...
- 基于Cocos2dx开发卡牌游戏Demo_放开那三国 2.0
PS:下载地址在最以下 1.登录 2.副本选择 3.地图 4. 选择敌人 5. 战斗 6. 战斗结算 7. 地图拓展 8. 武将拓展 9. 下载地址: 点击打开链接
- AntiXSS - 支持Html同时防止XSS攻击
AntiXSS - 支持Html同时防止XSS攻击 跨站脚本攻击(XSS)已经不是什么新鲜的话题了,甚至很多大公司也为此吃尽苦头.最简单直接的防范方法,就是不允许任何html标签输入,对用户输入进行编 ...