POJ 2112: Optimal Milking【二分,网络流】
题目大意: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【二分,网络流】的更多相关文章
- POJ 2112 Optimal Milking (二分 + 最大流)
题目大意: 在一个农场里面,有k个挤奶机,编号分别是 1..k,有c头奶牛,编号分别是k+1 .. k+c,每个挤奶机一天最让可以挤m头奶牛的奶,奶牛和挤奶机之间用邻接矩阵给出距离.求让所有奶牛都挤到 ...
- POJ 2112 Optimal Milking【网络流+二分+最短路】
求使所有牛都可以被挤牛奶的条件下牛走的最长距离. Floyd求出两两节点之间的最短路,然后二分距离. 构图: 将每一个milking machine与源点连接,边权为最大值m,每个cow与汇点连接,边 ...
- POJ 2112 Optimal Milking 【网络流】【二分】【最短路】
题意: k c m 分别代表挤奶机数量,牛数量,和挤奶机容量. 接下来(n=k+c)n*n的矩阵A,代表挤奶机或者牛的距离,如果对角线都为0,如果非对角线没有直接路相连也为0. 1 <= K & ...
- POJ 2112 Optimal Milking (二分+最短路+最大流)
<题目链接> 题目大意: 有K台挤奶机和C头奶牛,都被视为物体,这K+C个物体之间存在路径.给出一个 (K+C)x(K+C) 的矩阵A,A[i][j]表示物体i和物体j之间的距离,有些物体 ...
- 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 (多重匹配+传递闭包+二分)
题目链接: Poj 2112 Optimal Milking 题目描述: 有k个挤奶机,c头牛,每台挤奶机每天最多可以给m头奶牛挤奶.挤奶机编号从1到k,奶牛编号从k+1到k+c,给出(k+c)*(k ...
- POJ 2112—— Optimal Milking——————【多重匹配、二分枚举答案、floyd预处理】
Optimal Milking Time Limit:2000MS Memory Limit:30000KB 64bit IO Format:%I64d & %I64u Sub ...
- POJ 2112 Optimal Milking (Dinic + Floyd + 二分)
Optimal Milking Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 19456 Accepted: 6947 ...
随机推荐
- archsummit_bj2014
http://bj2014.archsummit.com/schedule.html 大会日程 时间 2014年12月19日 会议室 二号会议厅 7:45 入场注册 8:45 开场致辞 9:30 论高 ...
- UML建模图实战笔记
一.前言 UML:Unified Modeling Language(统一建模语言),使用UML进行建模的作用有哪些: 可以更好的理解问题 可以及早的发现错误或者被遗漏的点 可以更加方便的进行组员之间 ...
- 系统设计摘录CAP
系统架构设计理论与原则 这里主要介绍几种常见的架构设计理论和原则,常见于大中型互联系统架构设计. (一).CAP理论 1.什么是CAP 所谓CAP,即一致性(Consistency).可用性(Avai ...
- ubuntu 安装 pcap
最近在做负载均衡配置,希望将多个dhcp服务配置成一个虚拟dhcp地址,实现dhcp服务高可用.然而配置完成后却发现一个问题,该如何测试呢. 因此就要用上python了,然后ubuntu下面用pip ...
- Codeforces 1076D——最短路算法
题目 给你一个有n个顶点.m条边的无向带权图.需要擦除一些边使得剩余的边数不超过k,如果一个点在原始图到顶点1的最短距离为d,在删边后的图中到顶点的最短距离仍是d,则称这种点是 good.问如何删边, ...
- uva10735 Euler Circuit
题外话:很多混合图问题可以转化为有向图问题(将无向边拆为两条有向边) 本题不行,因为只能经过一次 这种问题能想到网络流.. 复习欧拉回路:入度==出度 和uva1380有点相似,要先给无向边定向.原图 ...
- Bug的分类和管理流程
1.按照严重程度划分 定义:是指Bug对软件质量的破坏程度,即BUG的存在将对软件的功能和性能产生怎样的影响 分类:系统崩溃.严重.一般.次要.建议 2.按优先级划分 定义:表示处理和修正软件缺陷的现 ...
- Java中wait()方法为什么要放在同步块中?(lost wake-up 问题)
问题起源 事情得从一个多线程编程里面臭名昭著的问题"Lost wake-up problem"说起. 这个问题并不是说只在Java语言中会出现,而是会在所有的多线程环境下出现. 假 ...
- CAD交互绘制圆(网页版)
CAD绘制图像的过程中,画圆的情况是非常常见的,用户可以在控件视区点取任意一点做为圆心,再动态点取半径绘制圆. 主要用到函数说明: _DMxDrawX::DrawCircle 绘制一个圆.详细说明如下 ...
- 【搜索】P1032 字串变换
题目描述 已知有两个字串A,B及一组字串变换的规则(至多6个规则): A1 ->B1 A2 -> B2 规则的含义为:在 A中的子串 A1 可以变换为B1,A2 可以变换为 ...