╰( ̄▽ ̄)╭

对于一张给定的 运输网络 ,Alice 先确定一个最大流 ,如果有多种解, Alice 可以任选一种; 之后 Bob在每条边上分配单位花费 (单位花费必须是非负实数), 要求所有边的单位花费之和等于 P。总费用等于每一条边 的实际流量乘以该边的单位花费。 需要注意到, Bob在分配单位花费之前,已经知道Alice 所给出的最大流方案。

现在 Alice 希望总费用尽量小,而Bob希望总费用尽量大。我们想知道, 如 果两个人都执行最优策略 ,最大流的值和总费用分别为多少。

对于 100% 的测试数据: N≤100 ,M≤1000 。

对于 100% 的测试数据: 所有点的编号在 1..N 范围内。 1≤每条边 的最大 流 量≤50000 。1≤P≤10 。给定运输网络中不会有起点和 终点 相同的边。

(⊙ ▽ ⊙)

显然Bob要把所有费用全部分配给实际流量最大的边。

所以Alice在满足最大流最大之余,使得流量最大的边最小

所以二分后再用最大流判断就可以了。

( ̄~ ̄)

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<math.h>
#include<string.h>
#define ll long long
#define eps 10e-7
using namespace std;
const char* fin="ex3215.in";
const char* fout="ex3215.out";
const int inf=0x7fffffff;
const int maxn=2007;
int n,m,n1,i,j,k;
int a[maxn][2],fi[maxn],ne[maxn],la[maxn],tot;
double l,r,mid,va[maxn],b[maxn],Ans;
int bz[maxn],card[maxn];
double Abs(double a){
return a>0?a:-a;
}
void add_line(int a,int b,double c){
tot++;
ne[tot]=fi[a];
la[tot]=b;
va[tot]=c;
fi[a]=tot;
}
void add(int a,int b,double c){
add_line(a,b,c);
add_line(b,a,0);
}
double gap(int v,double flow){
int i,k;
double use=0,j;
if (v==n) return flow;
for (k=fi[v];k;k=ne[k])
if (bz[la[k]]+1==bz[v] && Abs(va[k])>eps){
j=gap(la[k],min(va[k],flow-use));
use+=j;
va[k]-=j;
va[k^1]+=j;
if (Abs(flow-use)<eps || bz[1]==n) return use;
}
if (!--card[bz[v]]) bz[1]=n;
card[++bz[v]]++;
return use;
}
double flow(){
double ans=0;
memset(card,0,sizeof(card));
memset(bz,0,sizeof(bz));
card[0]=n;
while (bz[1]<n){
ans+=gap(1,inf);
}
return ans;
}
bool judge(double MAX){
int i,j,k;
memset(fi,0,sizeof(fi));
tot=1;
for (i=1;i<=m;i++) add(a[i][0],a[i][1],min(MAX,b[i]));
return Abs(flow()-Ans)<eps;
}
int main(){
scanf("%d%d%d",&n,&m,&n1);
tot=1;
for (i=1;i<=m;i++) scanf("%d%d%lf",&a[i][0],&a[i][1],&b[i]),add(a[i][0],a[i][1],b[i]);
Ans=flow();
l=0;
r=50000;
while (r-l>eps){
mid=(l+r)/2;
if (judge(mid)) r=mid;
else l=mid;
}
printf("%d\n%.4lf",int(Ans+eps),l*n1 );
return 0;
}

(⊙v⊙)

要注意的是网络流的实现时的问题:

double gap(int v,double flow){
int i,k;
double use=0,j;
if (v==n) return flow;
for (k=fi[v];k;k=ne[k])
if (bz[la[k]]+1==bz[v] && Abs(va[k])>eps){
j=gap(la[k],min(va[k],flow-use));
use+=j;
va[k]-=j;
va[k^1]+=j;
if (Abs(flow-use)<eps || bz[1]==n) return use;
}
if (!--card[bz[v]]) bz[1]=n;
card[++bz[v]]++;
return use;
}

1.三个中两个return返回的都是use;

2.当use==flow使,直接返回use;

3.到达汇点,返回flow。

【JZOJ3215】【SDOI2013】费用流的更多相关文章

  1. BZOJ3130: [Sdoi2013]费用流[最大流 实数二分]

    3130: [Sdoi2013]费用流 Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 960  Solved: 5 ...

  2. bzoj千题计划133:bzoj3130: [Sdoi2013]费用流

    http://www.lydsy.com/JudgeOnline/problem.php?id=3130 第一问就是个最大流 第二问: Bob希望总费用尽量大,那肯定是把所有的花费加到流量最大的那一条 ...

  3. P3305 [SDOI2013]费用流

    题目描述 Alice和Bob在图论课程上学习了最大流和最小费用最大流的相关知识. 最大流问题:给定一张有向图表示运输网络,一个源点S和一个汇点T,每条边都有最大流量. 一个合法的网络流方案必须满足: ...

  4. luogu P3305 [SDOI2013]费用流

    题目链接 bz似乎挂了... luogu P3305 [SDOI2013]费用流 题解 dalao告诉我,这题 似乎很水.... 懂了题目大意就可以随便切了 问1,最大流 问2,二分最大边权求,che ...

  5. BZOJ 3130: [Sdoi2013]费用流 网络流+二分

    3130: [Sdoi2013]费用流 Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 1230  Solved: ...

  6. BZOJ 3130: [Sdoi2013]费用流 网络流 二分 最大流

    https://www.lydsy.com/JudgeOnline/problem.php?id=3130 本来找费用流的题,权当复习一下网络流好了. 有点麻烦的是double,干脆判断大小或者二分增 ...

  7. BZOJ3130 [Sdoi2013]费用流

    AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=3130 这题codevs上也有,不过数据挂了[要A得看discuss]. 题目大意: Ali ...

  8. bzoj 3130 [Sdoi2013]费用流(二分,最大流)

    Description Alice和Bob在图论课程上学习了最大流和最小费用最大流的相关知识.    最大流问题:给定一张有向图表示运输网络,一个源点S和一个汇点T,每条边都有最大流量.一个合法的网络 ...

  9. [SDOI2013]费用流

    然而这是一道网络流... 如果满足Bob,使总费用最大: 设最大流的每条边流量(不是容量)为w[i],分配到每条边的费用为p[i],最大流量为wmax,p[i]的和为P 那么显然w[i] * p[i] ...

  10. Luogu P3305 [SDOI2013]费用流 二分 网络流

    题目链接 \(Click\) \(Here\) 非常有趣的一个题目. 关键结论:所有的单位费用应该被分配在流量最大的边上. 即:在保证最大流的前提下,使最大流量最小.这里我们采用二分的方法,每次判断让 ...

随机推荐

  1. thymeleaf报错元素类型必须由匹配的结束标记终止

    spring boot 1.x 版本中thymeleaf报错元素类型 “link” 必须由匹配的结束标记 “</link>” 终止解决办法: 1.在pom.xml文件中添加: <de ...

  2. 2019-8-31-C#-已知点和向量,求距离的点

    title author date CreateTime categories C# 已知点和向量,求距离的点 lindexi 2019-08-31 16:55:58 +0800 2018-05-08 ...

  3. 启发式搜索——A*算法

    启发式搜索 启发式搜索是一种对搜索到的每一个位置进行评估,然后从评估的最优位置进行搜索直到目的地, 由于搜索时对每一个位置的评估是基于直观或经验的所有叫启发式搜索 A*算法 历史: 1964年Nils ...

  4. Errors were encountered while processing: mysql-server-5.5

    ubuntu 中运行完sudo apt-get install curl之后,最后出现: ldconfig deferred processing now taking place Errors we ...

  5. 高德地图(AMap)JavaScript API的使用

    申请JSAPI的开发者key 申请地址:http://lbs.amap.com/dev/key 引入高德地图JavaScript API文件: <script type="text/j ...

  6. python使用suds来调用webservice

    对于python仅作为客户端调用webservice的情况,推荐使用suds库来完成,比起zsi,soapy之类,它可以说是相当轻量级,使用非常方便. 安装suds建议使用easy_insall来做. ...

  7. 移动端video视频播放问题

    1.视频播放后自动全屏 video添加playsinline  webkit-playsinline属性 2.安卓暂停或播放完毕不能滑动 通过js判断机型,安卓去掉controls属性,ios保留co ...

  8. [HEOI2016/TJOI2016]排序 线段树+二分

    [HEOI2016/TJOI2016]排序 内存限制:256 MiB 时间限制:6000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 题目描述 在2016年,佳媛姐姐喜欢上了数字序列.因而 ...

  9. line-height:2和line-height:2em的区别,它们是有区别的

    line-height:2是2倍的意思,如果内部有不同大小文字的情况下,以最大文字为倍数. line-height:2em也是2倍文字大小的意思,但如果内部有大文字,它还是会以父容 器的大小来计算. ...

  10. 基于TensorFlow理解CNN中的padding参数

    1 TensorFlow中用到padding的地方 在TensorFlow中用到padding的地方主要有tf.nn.conv2d(),tf.nn.max_pool(),tf.nn.avg_pool( ...