POJ 2112 Optimal Milking 【网络流】【二分】【最短路】
题意:
k c m 分别代表挤奶机数量,牛数量,和挤奶机容量。
接下来(n=k+c)n*n的矩阵A,代表挤奶机或者牛的距离,如果对角线都为0,如果非对角线没有直接路相连也为0。
1 <= K <= 30 1 <= C <= 200 1 <= M <= 15 0<=Aij<=200
求:在机器不能过载工作的前提下,最远的牛到挤奶机的距离的最小值。
思路:
1.先跑一遍FLOYD求出任何两点的最短路。
2.二分最远的距离,从源点到1到k号点的边容量为m,然后将权重不超过最远距离的边加进图中容量为1,最后将每头牛与汇点连容量为1的边。
3.如果最大流跑出来是牛的数量那么符合条件,注意这种情况是找YES_LEFT的情况。
坑点:
1.第二次被输入数据带有k的题目搞傻逼了,这种经常被用到的循环变量下次一定小心。
2.边权不超过200我tm就直接在1到200之间枚举了...无脑值无限大
致谢:
感谢卿学姐邻接表版的当前弧优化的dinic模板。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<string.h>
#define MAXN 500
#define MAXM 50000
using namespace std;
const int inf=0x3f3f3f3f;
struct Edge
{
int v,c,f,nx;
Edge() {}
Edge(int v,int c,int f,int nx):v(v),c(c),f(f),nx(nx) {}
} E[MAXM];
int G[MAXN],cur[MAXN],pre[MAXN],dis[MAXN],gap[MAXN],sz;
void init()
{
sz=; memset(G,-,sizeof(G));
}
void add_edge(int u,int v,int c)
{
E[sz]=Edge(v,c,,G[u]); G[u]=sz++;
E[sz]=Edge(u,,,G[v]); G[v]=sz++;
}
bool bfs(int S,int T)
{
static int Q[MAXN]; memset(dis,-,sizeof(dis));
dis[S]=; Q[]=S;
for (int h=,t=,u,v,it;h<t;++h)
{
for (u=Q[h],it=G[u];~it;it=E[it].nx)
{
if (dis[v=E[it].v]==-&&E[it].c>E[it].f)
{
dis[v]=dis[u]+; Q[t++]=v;
}
}
}
return dis[T]!=-;
}
int dfs(int u,int T,int low)
{
if (u==T) return low;
int ret=,tmp,v;
for (int &it=cur[u];~it&&ret<low;it=E[it].nx)
{
if (dis[v=E[it].v]==dis[u]+&&E[it].c>E[it].f)
{
if (tmp=dfs(v,T,min(low-ret,E[it].c-E[it].f)))
{
ret+=tmp; E[it].f+=tmp; E[it^].f-=tmp;
}
}
}
if (!ret) dis[u]=-; return ret;
}
int dinic(int S,int T)
{
int maxflow=,tmp;
while (bfs(S,T))
{
memcpy(cur,G,sizeof(G));
while (tmp=dfs(S,T,inf)) maxflow+=tmp;
}
return maxflow;
}
struct e{
int st,ed,dis;
e(){}
e(int a,int b,int c){
st=a;ed=b;dis=c;
}
};
bool cmp(e a,e b){
return a.dis<b.dis;
}
e eee[]; int pho[][];
int main()
{
int k,c,m;
scanf("%d%d%d",&k,&c,&m);
for(int i=;i<=k+c;i++){
for(int j=;j<=k+c;j++){
scanf("%d",&pho[i][j]);
if(pho[i][j]==&&i!=j){
pho[i][j]=inf;
}
}
}
for(int kk=;kk<=k+c;kk++){
for(int i=;i<=k+c;i++){
for(int j=;j<=k+c;j++){
if(pho[i][j]>pho[i][kk]+pho[kk][j]){
pho[i][j]=pho[i][kk]+pho[kk][j];
}
}
}
}
int num=;
for(int i=;i<=k+c;i++){
for(int j=;j<=k+c;j++){
eee[num++]=e(i,j,pho[i][j]);
}
}
sort(eee,eee+num,cmp);
int tnum=;
int s=,t=k+c+;
int ans=;
int l=,r=;
while(l<=r){
int mid=(l+r)>>;
init();
for(int j=;j<=k;j++){
add_edge(,j,m);
}
for(int j=k+;j<=k+c;j++){
add_edge(j,t,);
}
tnum=;
while(tnum<num&&eee[tnum].dis<=mid){
if(eee[tnum].st>k&&eee[tnum].ed<=k){
add_edge(eee[tnum].ed,eee[tnum].st,);
}
tnum++;
}
if(dinic(s,t)>=c)r=mid-;
else l=mid+;
}
printf("%d\n",l);
}
POJ 2112 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【二分,网络流】
题目大意:K台挤奶机,C个奶牛,每台挤奶器可以供M头牛使用,给出奶牛和和机器间的距离矩阵,求所有奶牛走最大距离的最小值 思路:最大距离的最小值,明显提示二分,将最小距离二分之后问题转化成为:K台挤奶机 ...
- POJ 2112 Optimal Milking(二分+最大流)
http://poj.org/problem?id=2112 题意: 现在有K台挤奶器和C头奶牛,奶牛和挤奶器之间有距离,每台挤奶器每天最多为M头奶挤奶,现在要安排路程,使得C头奶牛所走的路程中的最大 ...
- POJ - 2112 Optimal Milking (dijkstra + 二分 + 最大流Dinic)
(点击此处查看原题) 题目分析 题意:在一个农场中有k台挤奶器和c只奶牛,每个挤奶器最多只能为m只奶牛挤奶,每个挤奶器和奶牛都视为一个点,将编号1~k记为挤奶器的位置,编号k+1~k+c记为奶牛的位置 ...
- POJ 2112 Optimal Milking (Floyd+二分+最大流)
[题意]有K台挤奶机,C头奶牛,在奶牛和机器间有一组长度不同的路,每台机器每天最多能为M头奶牛挤奶.现在要寻找一个方案,安排每头奶牛到某台机器挤奶,使得C头奶牛中走过的路径长度的和的最大值最小. 挺好 ...
- Poj 2112 Optimal Milking (多重匹配+传递闭包+二分)
题目链接: Poj 2112 Optimal Milking 题目描述: 有k个挤奶机,c头牛,每台挤奶机每天最多可以给m头奶牛挤奶.挤奶机编号从1到k,奶牛编号从k+1到k+c,给出(k+c)*(k ...
- POJ 2112 Optimal Milking (Dinic + Floyd + 二分)
Optimal Milking Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 19456 Accepted: 6947 ...
- POJ 2112—— Optimal Milking——————【多重匹配、二分枚举答案、floyd预处理】
Optimal Milking Time Limit:2000MS Memory Limit:30000KB 64bit IO Format:%I64d & %I64u Sub ...
- POJ 2112 Optimal Milking (二分 + 最大流)
题目大意: 在一个农场里面,有k个挤奶机,编号分别是 1..k,有c头奶牛,编号分别是k+1 .. k+c,每个挤奶机一天最让可以挤m头奶牛的奶,奶牛和挤奶机之间用邻接矩阵给出距离.求让所有奶牛都挤到 ...
随机推荐
- css之cursor,float
鼠标形状: 在html中可以任意定义各个标签的显示形状,也可以此用来做些标签显示假像. <body> <p style="cursor: pointer"> ...
- Maven最佳实践:版本管理
什么是版本管理 首先,这里说的版本管理(version management)不是指版本控制(version control),但是本文假设你拥有基本的版本控制的知识,了解subversion的基本用 ...
- jQuery validate基本原则
Markup recommendations Each input has a label associated with it: The for-attribute of the label ref ...
- Partition does not end on cylinder boundary
fdisk可能会报该消息. DOS/Win95要求分区对齐到cyclinder boundary以适应CHS寻址. 然而现代OS都使用LBA寻址. 使用c命令关闭DOS兼容性检查. 使用u命令切换分区 ...
- iframe获取父、子窗口的方法
jquery.js调用iframe父窗口与子窗口元素的方法 1. jquery在iframe子页面获取父页面元素代码如下: $("#objid",parent.document) ...
- android学习笔记41——图形图像处理1
图像图像处理 ImageView:用于显示普通静态图片: AnimationDrawable:用于开发逐帧动画: Animation:用于对普通图片使用补间动画: Bitmap.BitmapFacto ...
- 虚拟研讨会:如何设计好的RESTful API?
http://www.infoq.com/cn/articles/how-to-design-a-good-restful-api/ REST架构风格最初由Roy T. Fielding(HTTP/1 ...
- 使用 HTML5 Shiv 让 IE 支持 HTML5
HTML5 Shiv 使用 html5.js 必须在页面head元素内调用(因为 IE 必须在元素解析前知道这个元素,所以这个 JS 文件不能在页面底部调用.) 作者已经把js文件放在Google c ...
- 黄聪:TinyMCE 4 增强 添加样式、按钮、字体、下拉菜单和弹出式窗口
我最喜欢 WordPress 3.9 的更新是使用了 TinyMCE 4.0 编辑器.新的 TinyMCE 看起来看起来更整洁(真正匹配WP仪表板),它有一些非常不错的附加功能.我的很多老主题和插件必 ...
- 2. hdfs
一.Hdfs的shell 所有hadoop的fs的shell均用uri路径作为参数 uri格式:schema://authority/path.hdfs的schema是hdfs.其中,schema和a ...