/*此题不错,大致题意: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. Android里的 ART、JIT、AOT、Dalvik之间有什么关系?

    ART.JIT.AOT.Dalvik之间有什么关系? JIT与Dalvik JIT是"Just In Time Compiler"的缩写,就是"即时编译技术", ...

  2. Oracle PL/SQL 编程手册(SQL大全)

    一.SQLPLUS 1引言 SQL命令 以下17个是作为语句开头的关键字: alterdroprevoke auditgrantrollback* commit*inse ...

  3. whatis命令

    whatis——于查询一个命令执行什么功能 示例1: # whatis ls 显示ls命令的功能,和执行man命令时NAME信息差不多

  4. javascript.json snippets vscode 注释

    vscode vue js里面的注释 javascript.json { // Place your global snippets here. Each snippet is defined und ...

  5. Hibernate-02 HQL实用技术

    学习任务 Query接口的使用 HQL基本用法 动态参数绑定查询 HQL的使用 Hibernate支持三种查询方式:HQL查询.Criateria查询.Native SQL查询. HQL是Hibern ...

  6. P2964 [USACO09NOV]硬币的游戏A Coin Game (DP)

    题意:n颗硬币 两个人从前往后按顺序拿 如果上一个人拿了i颗 那么下一个可以拿1-2*i颗 问先手能获得的最大收益 题解:比较典型的最大最小最大最小..DP了 但是暴力做的话是n^3 所以就体现出了这 ...

  7. python关于入参中,传入的是指针还是引用

    偶然看到别人的代码,发现有的会传入参数之后,做一次copy,试验一下,关于入参中,传入的是指针还是引用先说自己的结论:1.如果传入的是简单的类型,那么传入应该是引用的数值,2.假如传入的是df这种类型 ...

  8. bonding的系统初始化介绍

    bond0模块的加载 Bonding原理 为方便理解bonding的配置及实现,顺便阐述一下Linux的网络接口及其配置文件.在 Linux 中,所有的网络通讯都发生在软件接口与物理网络设备之间.与网 ...

  9. Xcode导入第三方库

    Xcode导入第三方库,例如TapkuLibrary iOS开源框架Tapku下载地址:https://github.com/devinross/tapkulibrary.git 1.创建你的工程项目 ...

  10. Brackets POJ - 2955

    解法 区间dp例题,每次枚举分段点的时候先更新如果开始到结束区间端点有闭合的括号,那么dp[start][end]=dp[start+1][end-1]+2其他照常枚举即可 代码 #include & ...