【题目分析】

很容易想到,可以把P放在流量最大的边上的时候最优。

所以二分网络流,判断什么时候可以达到最大流。

流量不一定是整数,所以需要实数二分,整数是会WA的。

【代码】

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib> //#include <map>
#include <set>
#include <queue>
#include <string>
#include <iostream>
#include <algorithm> using namespace std; #define maxn 1005
#define me 50005
#define inf 0x3f3f3f3f
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define eps 1e-8 void Finout()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
#endif
} int Getint()
{
int x=0,f=1; char ch=getchar();
while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}
while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
int h[me],to[me<<1],ne[me<<1];
double fl[me<<1];
int en=0,S=0,T=me-1;
int lim[me]; void add(int a,int b,double c)
{
// cout<<a<<" "<<b<<" "<<c<<endl;
to[en]=b; ne[en]=h[a]; fl[en]=c; h[a]=en++;
to[en]=a; ne[en]=h[b]; fl[en]=0; h[b]=en++;
} int map[maxn],tag=0; bool tell()
{
queue <int> q;
memset(map,-1,sizeof map);
map[S]=0;
q.push(S);
while (!q.empty())
{
int x=q.front(); q.pop();
for (int i=h[x];i>=0;i=ne[i])
{
if (map[to[i]]==-1&&fl[i]>eps)
{
map[to[i]]=map[x]+1;
q.push(to[i]);
}
}
}
if (map[T]!=-1) return true;
return false;
} double zeng(int k,double r)
{
if (k==T) return r;
double ret=0;
for (int i=h[k];i>=0&&ret<r;i=ne[i])
if (map[to[i]]==map[k]+1&&fl[i]>eps)
{
double tmp=zeng(to[i],min(fl[i],(double)r-ret));
ret+=tmp; fl[i]-=tmp; fl[i^1]+=tmp;
}
if (!ret) map[k]=-1;
return ret;
} int n,a[maxn],b[maxn],c[maxn],m,p; int main()
{
Finout();
memset(h,-1,sizeof h);
n=Getint(); m=Getint(); p=Getint();
S=1;T=n;
int maxx=0;
F(i,1,m)
{
a[i]=Getint();
b[i]=Getint();
c[i]=Getint();
add(a[i],b[i],(double)c[i]);
maxx=max(c[i],maxx);
}
double ans=0,tmp;
while (tell()) while(tmp=zeng(S,(double)inf)) ans+=tmp;
cout<<ans+eps<<endl;
double l=0,r=(double)maxx;
while (l+eps<r)
{
// cout<<l<<" "<<r<<endl;
double mid=(l+r)/2;
en=0;memset(h,-1,sizeof h);
F(i,1,m) add(a[i],b[i],min(mid,(double)c[i]));
double now=0,tmp;
while (tell()) while (tmp=zeng(S,(double)inf)) now+=tmp;
if (fabs(now-ans)<=eps) r=mid;
else l=mid;
}
printf("%.5f\n",l*p);
}

  

BZOJ 3130 [Sdoi2013]费用流 ——网络流的更多相关文章

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

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

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

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

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

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

  4. bzoj 3130: [Sdoi2013]费用流

    #include<cstdio> #include<iostream> #define M 10000 #define inf 0x7fffffff #include<c ...

  5. 3130: [Sdoi2013]费用流

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

  6. BZOJ 1283 序列 费用流 网络流 线性规划

    https://darkbzoj.cf/problem/1283 给出一个长度为N的正整数序列Ci,求一个子序列,使得原序列中任意长度为M的子串中被选出的元素不超过K(K,M<=100) 个,并 ...

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

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

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

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

  9. P3305 [SDOI2013]费用流

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

随机推荐

  1. IOS弹出视图preferredContentSize

    UIViewController.preferredContentSize代理旧方法 contentSizeForViewInPopover. self.contentSizeForViewInPop ...

  2. java 核心技术卷一笔记 6 .2接口 lambda 表达式 内部类

    6.2 接口实例 6.2.1 接口与回调 在java.swing包中有一个Timer类,可以使用它在到达给定的时间间隔时发出通告,假如程序中有一个时钟,就可以请求每秒钟获得一个通告,以便更新时钟的表盘 ...

  3. java 核心技术卷一笔记 6 .1.接口 lambda 表达式 内部类

    6.1.2 接口不是类,不能实例化一个接口:但是可以声明接口的变量:Comparable x;    接口变量必须引用实现了接口的类对象:x = new Employee(); 检查一个对象是否属于某 ...

  4. CAD交互绘制矩形批注(网页版)

    js中实现代码说明: 动态拖放时的绘制事件: function DynWorldDrawComment2( pCustomEntity,pWorldDraw, curPt) { // 得到绘制参数. ...

  5. Codeforces Round #271 (Div. 2)-B. Worms

    http://codeforces.com/problemset/problem/474/B B. Worms time limit per test 1 second memory limit pe ...

  6. Luogu P1782 旅行商的背包

    题目传送门 卡常背包果然名不虚传 算法主体就是两种背包分开跑,先跑多重背包,再跑奇货 不知道为什么,这题二进制拆分好像要比单调队列优化快一些 然后这题毒瘤的地方就出来了: 如果一件物品的体积\(\ti ...

  7. JS与IOS、安卓的交互

    最近做的项目中涉及到了与安卓和ios的交互问题,对于一个新手来说,多多少少会有点迷糊.在调用安卓和ios的callback回调时,很轻松的就调用成功了,而且,步骤也不那么繁琐.刚开始,只知道那样使用可 ...

  8. OS复习

    提纲 一 操作系统的定义,各章节名词定义. 分时多道- OS四大特征,五大功能. 二 进程 创建终止挂起激活 PCB 原语:创建终止挂起激活唤醒 互斥和同步,临界资源,临界区 信号量的基础概念,受保护 ...

  9. 【php】类型转换

    $a = 9; print_r((array) $a) ; 输出: [0=>9] print_r((array) null); 输出: []

  10. web开发框架之DRF

    RESTful架构解释: # Representational State Transfer 表现层状态转化 到底什么是RESTFul架构: 如果一个架构符合REST原则,就称它为RESTful架构. ...