题目大意:K台挤奶机,C个奶牛,每台挤奶器可以供M头牛使用,给出奶牛和和机器间的距离矩阵,求所有奶牛走最大距离的最小值

思路:最大距离的最小值,明显提示二分,将最小距离二分之后问题转化成为:K台挤奶机,C个奶牛,每台挤奶器可以供M头牛使用,已知每头牛可以到的挤奶机是哪些,问能否让所有奶牛挤上奶。

这个问题就是典型的二分图多重匹配问题,跑个网络流看是否满流即可,最后才发现给出的矩阵不一定是最短路径TUT 所以要跑一遍floyd

#include<iostream>

#include<cstdio>

#include <queue>

#include <string.h>

#define maxn 100000

#define inf 200000

using namespace std;

int head[maxn],point[maxn],next[maxn],flow[maxn];

int dis[maxn],now=0,dist[maxn];

int map[300][300],k,c,m,cop[maxn];

void floyd(int n){

for(int k=1;k<=n;k++)

for(int i=1;i<=n;i++)if(i!=k)

for(int j=1;j<=n;j++)if(j!=i && j!=k)

map[i][j]=min(map[i][j],map[i][k]+map[k][j]);

}

void add(int x,int y,int v,int vv){

next[++now]=head[x];head[x]=now;point[now]=y;flow[now]=v;

dis[now]=vv;next[++now]=head[y];head[y]=now;point[now]=x;flow[now]=0;dis[now]=vv;

}

int bfs(int s,int t,int x)

{

memset(dist,-1,sizeof(dist));

dist[s]=0;queue<int>q;q.push(s);

while(!q.empty())

{

int u=q.front();q.pop();

for(int i=head[u];i;i=next[i])

{

int k=point[i];

if(dist[k]==-1 && flow[i]!=0 && dis[i]<=x)

{

dist[k]=dist[u]+1;q.push(k);

}

}

}return dist[t]!=-1;

}

int dfs(int s,int d,int t,int x)

{

if(s==t)return d;int res=0;

for(int i=head[s];i&&res<d;i=next[i])

{

int u=point[i];

if(dist[u]==dist[s]+1 && flow[i]&& dis[i]<=x)

{

int dd=dfs(u,min(d-res,flow[i]),t,x);

if(dd){

flow[i]-=dd;flow[((i-1)^1)+1]+=dd;res+=dd;

}

}

}

if(res==0)dist[s]=-1;return res;

}

int judge(int x,int s,int t)

{

int ans=0;

while(bfs(s,t,x))ans+=dfs(s,inf,t,x);

memcpy(flow,cop,sizeof(flow));

if(ans==c)return 1;else return 0;

}

int main()

{

scanf("%d%d%d",&k,&c,&m);

int s=k+c+10,t=k+c+11,l=0,r=20000;

for(int i=1;i<=k+c;i++)

for(int j=1;j<=k+c;j++)

{

scanf("%d",&map[i][j]);if(map[i][j]==0)map[i][j]=inf;

}

floyd(k+c);

for(int i=k+1;i<=k+c;i++)

for(int j=1;j<=k;j++)

if(map[i][j]!=inf) add(i,j,1,map[i][j]);

for(int i=1;i<=k;i++)add(i,t,m,0);

for(int i=k+1;i<=k+c;i++)add(s,i,1,0);

memcpy(cop,flow,sizeof(flow));

while(l<r)

{

int mid=(l+r)>>1;

if(judge(mid,s,t))r=mid;else l=mid+1;

}

printf("%d\n",l);

return 0;

}

POJ 2112: Optimal Milking【二分,网络流】的更多相关文章

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

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

  2. POJ 2112 Optimal Milking【网络流+二分+最短路】

    求使所有牛都可以被挤牛奶的条件下牛走的最长距离. Floyd求出两两节点之间的最短路,然后二分距离. 构图: 将每一个milking machine与源点连接,边权为最大值m,每个cow与汇点连接,边 ...

  3. POJ 2112 Optimal Milking 【网络流】【二分】【最短路】

    题意: k c m 分别代表挤奶机数量,牛数量,和挤奶机容量. 接下来(n=k+c)n*n的矩阵A,代表挤奶机或者牛的距离,如果对角线都为0,如果非对角线没有直接路相连也为0. 1 <= K & ...

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

    <题目链接> 题目大意: 有K台挤奶机和C头奶牛,都被视为物体,这K+C个物体之间存在路径.给出一个 (K+C)x(K+C) 的矩阵A,A[i][j]表示物体i和物体j之间的距离,有些物体 ...

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

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

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

    POJ 2112 Optimal Milking 链接:http://poj.org/problem?id=2112 题意:农场主John 将他的K(1≤K≤30)个挤奶器运到牧场,在那里有C(1≤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——————【多重匹配、二分枚举答案、floyd预处理】

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

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

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

随机推荐

  1. Windows API函数大全三

    7. API之位图.图标和光栅运算函数 BitBlt 将一幅位图从一个设备场景复制到另一个 CopyIcon 制作指定图标或鼠标指针的一个副本.这个副本从属于发出调用的应用程序 CopyImage 复 ...

  2. 解决Eclipse自动补全变量名的问题

    原文地址: https://blog.csdn.net/czh500/article/details/53162157

  3. 【学习笔记】深入理解js原型和闭包(11)——执行上下文栈

    继续上文的内容. 执行全局代码时,会产生一个执行上下文环境,每次调用函数都又会产生执行上下文环境.当函数调用完成时,这个上下文环境以及其中的数据都会被消除,再重新回到全局上下文环境.处于活动状态的执行 ...

  4. eclipse搭建android开发环境详细步骤

    搭建android应用的开发环境,一套程序下来也是相当繁琐的,这里我整理下一整套详细流程: 1,下载JDK 去oracle官网下载最新版本的jdk,官网地址 http://www.oracle.com ...

  5. ubuntu服务器切换语言

    如果在安装Ubuntu Server时选择了中文,在系统安装完毕后,默认是中文,在操作时经常会显示乱码,如果需要设置回英文,则修改/etc/default/locale,将 LANG="cn ...

  6. 怎么用eclipse生成jar文件?eclipse导出jar介绍

    1 .我们先要增加jar需要的配置文件,选中项目的src目录,鼠标右键,选择 [New] -选择 [Folder] . 2. 输入META-INF 作为目录名称,点击[Finish] . 3. 选中刚 ...

  7. how to make a function from using global var to not using it

    let say, we want to find the bottom left node in a tree.one way to do it is using global vars: /** * ...

  8. Robot Framework(十四) 扩展RobotFramework框架——创建测试库

    4.1创建测试库 Robot Framework的实际测试功能由测试库提供.有许多现有的库,其中一些甚至与核心框架捆绑在一起,但仍然经常需要创建新的库.这个任务并不复杂,因为正如本章所示,Robot ...

  9. @click.native 会触发原生 click事件 vue

    @click.native 会触发原生 click事件 vue

  10. 【搜索】P1032 字串变换

    题目描述 已知有两个字串A,B及一组字串变换的规则(至多6个规则): A1​ ->B1​ A2​ -> B2​ 规则的含义为:在 A中的子串 A1​ 可以变换为B1​,A2​ 可以变换为  ...