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头奶牛的奶,奶牛和挤奶机之间用邻接矩阵给出距离.求让所有奶牛都挤到 ...
随机推荐
- xunsearch安装配置
1.wget http://www.xunsearch.com/download/xunsearch-full-latest.tar.bz2 2.tar -xjf xunsearch-full-lat ...
- 64位python安装MySQL-python 1.2.5
在64位的python直接安装MySQL-python 1.2.5有问题,参考http://www.linuxfly.org/windows_install_mysql_python_library/ ...
- AMD规范:define和require的区别
define和require在依赖处理和回调执行上都是一样的,不一样的地方是define的回调函数需要有return语句返回模块对象(注意是对象),这样define定义的模块才能被其他模块引用:req ...
- asp.net中virtual和abstract的区别分析
这篇文章主要介绍了asp.net中virtual和abstract的区别,较为详细的分析了virtual与abstract的概念与具体用法,并以实例的形式予以总结归纳,需要的朋友可以参考下 本文实例分 ...
- [转]Hibernate3如何解决n+1 selects
摘自: http://blog.chinaunix.net/uid-20586655-id-287959.html Hibernate3中取得多层数据的所产生的n+1 selects问题的解决 ...
- 【原创】VNC-view配置
*.hl_mark_KMSmartTagPinkImg{background-color:#ffaaff;}*.hl_mark_KMSmartTagBlueImg{background-color:# ...
- 利用maven的filter和profile实现不同环境使用不同的配制
在我们平常的java开发中,会经常使用到很多配制文件(xxx.properties,xxx.xml),而当我们在本地开发(dev),测试环境测试(test),线上生产使用(product)时,需要不停 ...
- Python 共享和上传函数模块到PyPI
1. register account by brower on https://pypi.python.org/pypi/ 2. register your moudle "nester& ...
- 关于ORALCE一个表空间的数据导入到另一个表空间的方法(原创)
用户: whnaproject 所属表空间: whnaproject 新用户 : wniec 所属新表空间: wniec 要求:将用户whnaproject中的数 ...
- 99. Recover Binary Search Tre
Two elements of a binary search tree (BST) are swapped by mistake. Recover the tree without changing ...