题目大意: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. P2667 超级质数

    https://www.luogu.org/problem/show?pid=2667 题目背景 背景就是描述,描述就是背景...... 题目描述 一个质数如果从个位开始,依次去掉一位数字,两位数字, ...

  2. C#的WinForm中Label透明一例

    很久之前開發的一個MIS系統,里面有個登錄界面,採用了PictureBox做背景,上面放了一些Label,試了很多方面不能實現透明,如下圖: 這次重新啟用該系統,看了一下原因,很簡單,原來Label的 ...

  3. coursera网站中的VTT字幕的使用

    coursera网站中的VTT字幕的使用 1.https://www.coursera.org/learn/os-virtsecurity/lecture/xuWgP/1-3-cao-zuo-xi-t ...

  4. Android性能分析工具Profile GPU rendering详细介绍

    如何在一个应用中追踪和定位性能问题,甚至在没有它的源代码的情况下?? “Profile GPU rendering”(GPU渲染分析),一款Android4.1所引入的工具.你可以在“设置”应用的“开 ...

  5. Keil简介

    最早接触Keil是学习开发8051系列的单片机.Keil C51是Keil公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上.结构性.可读性.可维护性上有明显的优势,因而易学易 ...

  6. win应用只允许单个实例运行,并将已运行实例窗口置顶

    关键词:windows,c++,桌面应用,单个实例,窗口置顶 目标:1.判断本程序是否已有一个实例在运行.2.若有,则激活已在运行的实例(将其窗口置顶),并退出当前运行. 1.使用semaphore来 ...

  7. Summary of 2016 International Trusted Computing and Cloud Security Summit

    1)      Welcome Remarks 2)      The advancement of Cloud Computing and Tursted Computing national st ...

  8. 【Conclusion】MySQL的安装和使用

    MySQL使用 因为数据库实验用到了MySQL,这里对现在已经涉及到的MySQL部分操作做一个简单的小结. 1.安装MySQL 上MySQL的官网下载对应自己OS平台的MySQL安装文件,有在线安装和 ...

  9. H5里div多行显示省略号

    display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: ; overflow: hidden; -webkit- ...

  10. 转--C#编程总结

    C#编程总结--总目录 http://www.cnblogs.com/yank/p/3543423.html