题意:

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 【网络流】【二分】【最短路】的更多相关文章

  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【二分,网络流】

    题目大意:K台挤奶机,C个奶牛,每台挤奶器可以供M头牛使用,给出奶牛和和机器间的距离矩阵,求所有奶牛走最大距离的最小值 思路:最大距离的最小值,明显提示二分,将最小距离二分之后问题转化成为:K台挤奶机 ...

  4. POJ 2112 Optimal Milking(二分+最大流)

    http://poj.org/problem?id=2112 题意: 现在有K台挤奶器和C头奶牛,奶牛和挤奶器之间有距离,每台挤奶器每天最多为M头奶挤奶,现在要安排路程,使得C头奶牛所走的路程中的最大 ...

  5. POJ - 2112 Optimal Milking (dijkstra + 二分 + 最大流Dinic)

    (点击此处查看原题) 题目分析 题意:在一个农场中有k台挤奶器和c只奶牛,每个挤奶器最多只能为m只奶牛挤奶,每个挤奶器和奶牛都视为一个点,将编号1~k记为挤奶器的位置,编号k+1~k+c记为奶牛的位置 ...

  6. POJ 2112 Optimal Milking (Floyd+二分+最大流)

    [题意]有K台挤奶机,C头奶牛,在奶牛和机器间有一组长度不同的路,每台机器每天最多能为M头奶牛挤奶.现在要寻找一个方案,安排每头奶牛到某台机器挤奶,使得C头奶牛中走过的路径长度的和的最大值最小. 挺好 ...

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

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

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

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

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

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

  10. POJ 2112 Optimal Milking (二分 + 最大流)

    题目大意: 在一个农场里面,有k个挤奶机,编号分别是 1..k,有c头奶牛,编号分别是k+1 .. k+c,每个挤奶机一天最让可以挤m头奶牛的奶,奶牛和挤奶机之间用邻接矩阵给出距离.求让所有奶牛都挤到 ...

随机推荐

  1. android 添加依赖的库文件

    Notpad: 2016-3-16: 1.android 添加依赖的库文件 右键自己的项目 -> properties ->android ->在Library处点击add -> ...

  2. Golang_test

    package main import ( "fmt" "time" ) func GetName() { //没事玩一下循环 for i := 0; i &l ...

  3. C#基础——Func和Action的介绍及其用法

    Func是一种委托,这是在3.5里面新增的,2.0里面我们使用委托是用Delegate,Func位于System.Core命名空间下,使用委托可以提升效率,例如在反射中使用就可以弥补反射所损失的性能. ...

  4. Linux下 RabbitMQ的安装与配置

    以下教程摘录自互联网并做了适当修改,测试的rabbitmq 版本为:rabbitmq-server-generic-unix-3.5.6 各版本之间会有差异!!! 一  Erlang安装 Rabbit ...

  5. Android App启动错误的问题(connection to the server was unsuccessful)

    问题描述: PhoneGap+Sencha Touch开发的应用,打包后的APP或者调试期间,在启动的时候提示如下信息: Application Error - The connection to t ...

  6. Android Intent 用法全面总结

    [代码全屏查看]-Android Intent 用法全面总结 // [1].[代码] 调用拨号程序 跳至 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] / ...

  7. ios外派—本公司长年提供ios程序员外派业务(北京动点软件,可签合同)

    北京动点飞扬长年提供ios工程师外派业务. 我公司程序员平均技术情况如下: 1.二年以上iPhone/ipad开发经验:2.熟练使用Xcode.Objective C编码技能:3.熟悉iOS开发框架, ...

  8. php xdebug xampp eclipse

    Eclipse配置 一:配置workspace 打开Eclipse for PHP Developers,需要设置workspace,这个必须设置到C:\xampp\htdocs目录,否则待会无法进行 ...

  9. 【Struts2学习笔记-4】包含其他配置文件

    包含其他配置文件 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLI ...

  10. [tty与uart]stty命令使用

    中文解释链接:http://linux.51yip.com/search/stty 英文解释链接:http://pubs.opengroup.org/onlinepubs/9699919799/uti ...