/*此题不错,大致题意: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. chrome inspect出现白屏的解决方案

    点inspect后 弹出框,可是里面一片白色 PS:原效果不是这样,只是图找不到随便p的 原因可以看这个:http://www.cnblogs.com/slmk/p/7591126.html 大概意思 ...

  2. Linux 从源码编译安装 Nginx

    Nginx 是一个高性能的 HTTP 和 反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器.Nginx 编译安装比较简单,难点在于配置.下面是 Nignx 0.8.54 编译安装和简 ...

  3. Qt中为QPushButton添加背景图片

    有2种方式,一种是在代码中设置,另外一种是直接在Qt Creator中直接设置,下面是第二种 参考: http://doc.qt.io/qt-4.8/stylesheet-examples.html ...

  4. qt5 上传图片到http服务器

    转载请注明出处:http://www.cnblogs.com/dachen408/p/8185060.html qt5 上传图片到http服务器,亲测可以用,qt5.8+vs2015,直接上码; 头文 ...

  5. postman使用--添加headers、授权、cookies

    添加headers Request Headers(请求头)用来说明服务器要使用的附加信息,比较重要的信息有:Cookie,Referer,User-Agent等.在postman中可以在请求下方的H ...

  6. 框模型中设置内容区域元素占地尺寸box-sizing属性

    盒子模型有两种 一种是 内容盒子模型(content-box)一种是边框盒子模型(border-box). content-box:设置的尺寸,只设置内容区域, 左外边距+左边框+左内边距+内容区域宽 ...

  7. navicate备份与还原数据库

    参考:https://jingyan.baidu.com/article/574c521977dea06c8d9dc1b1.html 1.备份数据库 首先新建数据库 选中数据库下方的“备份”,右击“新 ...

  8. ç7—UIViewController

    UIViewController继承了UIResponder,而UIResponder继承了NSObject,UIViewController是所有视图控制器的父类. 在MVC模式中,UIViewCo ...

  9. 前端学习日记-vue cli3.0环境搭建

    卸载老版本的 vue-cli : npm uninstall vue-cli -g 安装新版本的 : npm install -g @vue/cli --安装新版本cli 同时nodeJS 要更新至 ...

  10. 一套出完被喷爆的noip提高组+的题目

    这是一个悲伤的故事. 校内胡测嘛,这当然的重视啦,好好地出完题,看题面不是很难哦,那就用它吧. 结果今天老师考试就用上了(情况不妙) 果然考试过程中就有打喷嚏的冲动. 一道暴力,一道概率DP,一道主席 ...