/*此题不错,大致题意:c头牛去k个机器处喝奶,每个喝奶处最多容纳M头牛,求所有牛中走的最长路的

那头牛,使该最长路最小。思路:最大最小问题,第一灵感:二分答案check之。对于使最长路最短,

用folyd算出所有牛到每个喝奶点的最短路,每次枚举最大值,取不大于该值的路,重新构图;把所有牛赶去

喝奶点,在喝奶点有限制,不是多源多汇吗?!取超级源点,限制为1(一头牛),超级汇点,限制为

m,即可。其他路限制随意。

关键点:分清哪些是流量,最短路只是构图的一个方式(条件)。此题注意编号(原图1--k是目标,后面是

牛(起点)。)

#include<iostream>   //140ms, 1A
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
int k,c,m;const int inf =0x3f3f3f3f;
int a[250][250]; int minmax;
int e[20000][3];int head[250]; //链式前向星二维数组表示法,0:to,1:pre,2:wight;
void folyd() //最短路不用说
{
for(int i=1;i<=k+c;i++)
for(int j=1;j<=k+c;j++)
for(int ii=1;ii<=k+c;ii++)
{
if(a[j][ii]>a[j][i]+a[i][ii])
{
a[j][ii]=a[j][i]+a[i][ii];
if(a[j][ii]>minmax)minmax=a[j][ii]; //枚举上界
}
}
}
void build(int limit) //由限制,选小于之的路,重新构图
{
for(int i=0;i<=k+c+2;i++)
head[i]=-1;
int num=0;
for(int i=c+1;i<=c+k;i++) //超级汇点
{
e[num][0]=c+k+1;e[num][1]=head[i];head[i]=num;
e[num++][2]=m;
e[num][0]=i;e[num][1]=head[c+k+1];head[c+k+1]=num;
e[num++][2]=0;
}
for(int i=1;i<=c;i++) //超级源点
{
e[num][0]=0;e[num][1]=head[i];head[i]=num;
e[num++][2]=0;
e[num][0]=i;e[num][1]=head[0];head[0]=num;
e[num++][2]=1;
}
for(int i=1;i<=k;i++) //其他点
for(int j=k+1;j<=k+c;j++)
if(a[i][j]<=limit)
{
e[num][0]=j-k;e[num][1]=head[i+c];head[i+c]=num;
e[num++][2]=0;
e[num][0]=i+c;e[num][1]=head[j-k];head[j-k]=num;
e[num++][2]=1;
}
}
int level[250];int vis[250];
bool bfs() //bfs+dfs,dinic算法
{
for(int i=0;i<=k+c+1;i++)
vis[i]=level[i]=0;
queue<int>q;
q.push(0);vis[0]=1;
while(!q.empty())
{
int cur=q.front();q.pop();
for(int i=head[cur];i!=-1;i=e[i][1])
{ int to=e[i][0];
if(!vis[to]&&e[i][2]>0)
{
vis[to]=1;
level[to]=level[cur]+1;
if(to==k+c+1)return 1;
q.push(to);
}
}
}
return vis[k+c+1];
}
int dfs(int uu,int minf)
{
if(uu==k+c+1||minf==0)return minf;
int sum=0,f;
for(int i=head[uu];i!=-1&&minf;i=e[i][1])
{ int to=e[i][0];
if(level[to]==level[uu]+1&&e[i][2]>0)
{
f=dfs(to,minf<e[i][2]?minf:e[i][2]);
e[i][2]-=f;e[i^1][2]+=f;
sum+=f;minf-=f;
}
}
return sum;
}
bool check(int limit)
{
build(limit);
int sumflow=0;
while(bfs())
{
sumflow+=dfs(0,inf);
}
if(sumflow==c) //所有牛可以去才是对
return 1;
return 0;
}
int main()
{
scanf("%d%d%d",&k,&c,&m);
for(int i=1;i<=k+c;i++)
for(int j=1;j<=k+c;j++)
{
int temp1;
scanf("%d",&temp1);
if(temp1==0)a[i][j]=inf;
else a[i][j]=temp1;
}
folyd();
int left=0,right=minmax,mid;
while(right>left+1) //二分答案,注意一下
{
mid=(right+left)/2;
if(check(mid))
{
right=mid;
}
else
left=mid;
}
if(check(right-1)) //最后二分时判断特殊情况
printf("%d\n",right-1);
else
printf("%d\n",right); }

poj2112 二分+floyd+多源多汇最大流的更多相关文章

  1. poj1459 Power Network (多源多汇最大流)

    Description A power network consists of nodes (power stations, consumers and dispatchers) connected ...

  2. 2018.07.06 POJ 1459 Power Network(多源多汇最大流)

    Power Network Time Limit: 2000MS Memory Limit: 32768K Description A power network consists of nodes ...

  3. [poj1459]Power Network(多源多汇最大流)

    题目大意:一个网络,一共$n$个节点,$m$条边,$np$个发电站,$nc$个用户,$n-np-nc$个调度器,每条边有一个容量,每个发电站有一个最大负载,每一个用户也有一个最大接受量.问最多能供给多 ...

  4. hdoj 2066 一个人的旅行 【多源多汇最短路】

    题目:hdoj 2066 一个人的旅行 方法:缩点 + 最短路 分析:看了大神的一篇博客,讲冗余压缩的,然后就想找一个多源最短路练练手. 这个题目就是典型的多源多汇最短路 方法:把全部的源点压缩成一个 ...

  5. Vijos 1006 晴天小猪历险记之Hill 单源单汇最短路

    背景 在很久很久以前,有一个动物村庄,那里是猪的乐园(^_^),村民们勤劳.勇敢.善良.团结-- 不过有一天,最小的小小猪生病了,而这种病是极其罕见的,因此大家都没有储存这种药物.所以晴天小猪自告奋勇 ...

  6. CSU 1817 Bones’s Battery Submit(二分+Floyd)

    Bones's Battery Submit [题目链接]Bones's Battery Submit [题目类型]二分+Floyd &题意: 有n个点,m条边,从点ui到点vi的费电量是di ...

  7. poj1459多源多汇最大流问题

    /*基本构图题,多源多汇,添加一个源点和一个汇点,所有源点都来自这个源点,同理,所有汇点 都汇于这个汇点,dinic第二战,本来应该1A的,犯了一个低级错误!while(scanf("%d) ...

  8. poj-3436.ACM Computer Factory(最大流 + 多源多汇 + 结点容量 + 路径打印 + 流量统计)

    ACM Computer Factory Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10940   Accepted:  ...

  9. [BZOJ3698]XWW的难题解题报告|上下界网络流|有源汇最大流

    XWW是个影响力很大的人,他有很多的追随者.这些追随者都想要加入XWW教成为XWW的教徒.但是这并不容易,需要通过XWW的考核.XWW给你出了这么一个难题:XWW给你一个N*N的正实数矩阵A,满足XW ...

随机推荐

  1. WARN警告:Going to buffer response body of large or unknown size. Using getResponseBodyAsStream instead is recommended

    使用Apache HttpClient发送请求,有大量WARN警告:Going to buffer response body of large or unknown size. Using getR ...

  2. iOS 二维码的生成 QREncoder

    生成二维码: 在生成二维码的库中QREncoder最为常见,但是由于中文字符的特殊性,生成中文的时候有时会出现一定的错误,所以建议使用libqrencode,是一个纯C编写的类库. 以libqrenc ...

  3. Ubuntu 创建docker 容器 系列一

    docker 官网安装地址:https://docs.docker.com/install/linux/docker-ce/ubuntu/ 1.Ubuntu的版本要在12.04 LTS 以上,使用un ...

  4. vue项目中快捷语法糖

    1.Vue.js是渐进式框架,采用自底向上增量开发的设计基于MVVM思想. 2.Vue 完全有能力驱动采用单文件组件和Vue生态系统支持的库开发的复杂单页应用. 3.Vue.js 的目标是通过尽可能简 ...

  5. 洛谷 P2319 [HNOI2006]超级英雄

    题目描述 题目描述 现在电视台有一种节目叫做超级英雄,大概的流程就是每位选手到台上回答主持人的几个问题,然后根据回答问题的多少获得不同数目的奖品或奖金.主持人问题准备了若干道题目,只有当选手正确回答一 ...

  6. 洛谷 P1216 [USACO1.5]数字三角形 Number Triangles(水题日常)

    题目描述 观察下面的数字金字塔. 写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大.每一步可以走到左下方的点也可以到达右下方的点. 7 3 8 8 1 0 2 7 4 4 4 5 ...

  7. (转)SpringMVC学习(九)——SpringMVC中实现文件上传

    http://blog.csdn.net/yerenyuan_pku/article/details/72511975 这一篇博文主要来总结下SpringMVC中实现文件上传的步骤.但这里我只讲单个文 ...

  8. java-基于泛型和反射机制的通用比较器实现

    一.前言 Java的比较器是用来对List集合进行排序用的,分为内部比较器和外部比较器两类 内部比较器:被排序的类要 implements Comparable 类,并实现compareTo方法. 外 ...

  9. autoHeight # 动态高度添加 用 window.addEventListener('resize', function () {

    动态高度添加 用 window.addEventListener('resize', function () { mounted () { this.init() window.addEventLis ...

  10. pooling需要注意的一个地方

    max pooling 在不同的 depth 上是分开执行的,且不需要参数控制.也就是说,pooling之后,feature map的维度不会改变