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

3130: [Sdoi2013]费用流

Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special Judge
Submit: 960  Solved: 505
[Submit][Status][Discuss]

Description

 Alice和Bob在图论课程上学习了最大流和最小费用最大流的相关知识。
    最大流问题:给定一张有向图表示运输网络,一个源点S和一个汇点T,每条边都有最大流量。一个合法的网络流方案必须满足:(1)每条边的实际流量都不超过其最大流量且非负;(2)除了源点S和汇点T之外,对于其余所有点,都满足该点总流入流量等于该点总流出流量;而S点的净流出流量等于T点的净流入流量,这个值也即该网络流方案的总运输量。最大流问题就是对于给定的运输网络,求总运输量最大的网络流方案。


  上图表示了一个最大流问题。对于每条边,右边的数代表该边的最大流量,左边的数代表在最优解中,该边的实际流量。需要注意到,一个最大流问题的解可能不是唯一的。    对于一张给定的运输网络,Alice先确定一个最大流,如果有多种解,Alice可以任选一种;之后Bob在每条边上分配单位花费(单位花费必须是非负实数),要求所有边的单位花费之和等于P。总费用等于每一条边的实际流量乘以该边的单位花费。需要注意到,Bob在分配单位花费之前,已经知道Alice所给出的最大流方案。现茌Alice希望总费用尽量小,而Bob希望总费用尽量大。我们想知道,如果两个人都执行最优策略,最大流的值和总费用分别为多少。

Input

    第一行三个整数N,M,P。N表示给定运输网络中节点的数量,M表示有向边的数量,P的含义见问题描述部分。为了简化问题,我们假设源点S是点1,汇点T是点N。
    接下来M行,每行三个整数A,B,C,表示有一条从点A到点B的有向边,其最大流量是C。

Output

第一行一个整数,表示最大流的值。
第二行一个实数,表示总费用。建议选手输出四位以上小数。

Sample Input

3 2 1
1 2 10
2 3 15

Sample Output

10
10.0000

HINT

 

【样例说明】

    对于Alice,最大流的方案是固定的。两条边的实际流量都为10。

    对于Bob,给第一条边分配0.5的费用,第二条边分配0.5的费用。总费用

为:10*0.5+10*0.5=10。可以证明不存在总费用更大的分配方案。

【数据规模和约定】

    对于20%的测试数据:所有有向边的最大流量都是1。

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

    对于l00%的测试数据:所有点的编号在I..N范围内。1 < = 每条边的最大流

量 < = 50000。1 < = P < = 10。给定运输网络中不会有起点和终点相同的边。


 

  • 第一问不用说了
  • 假设现在已经有了一个最大流的方案,那么Bob一定会把 P 的费用全用到流量最大的那条边上
  • 也就是说要让最大流量的边最小
  • 二分边的最大流看,检查是否还能求得同样大小的最大流
  • 注意要实数二分,不能整数二分

最大流本身是一定的整数,但是为满足最优解,某一条边的流量可以是实数。所以这题是实数网络流!

实数二分好坑.........不要m+-1,不要保留一个ans,只是简单的二分l和r行了,最后取那一个都行

//
//  main.cpp
//  sdoi2003费用流
//
//  Created by Candy on 25/11/2016.
//  Copyright © 2016 Candy. All rights reserved.
//

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=105,M=1005,INF=1e9;
const double eps=1e-5;
int read(){char c=getchar();int x=0,f=1;while(c<'0'||c>'9'){if(c=='-')f=-1; c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0'; c=getchar();}return x*f;
}
int n,m,p,u,v,c,s,t;
struct data{int u,v,c;
}a[M];
struct edge{int v,ne;double c,f;
}e[M<<1];
int h[N],cnt=0;
inline void ins(int u,int v,double c){cnt++;e[cnt].v=v;e[cnt].c=c;e[cnt].f=0;e[cnt].ne=h[u];h[u]=cnt;cnt++;e[cnt].v=u;e[cnt].c=0;e[cnt].f=0;e[cnt].ne=h[v];h[v]=cnt;
}
void build(double mid){cnt=0;memset(h,0,sizeof(h));for(int i=1;i<=m;i++) ins(a[i].u,a[i].v,min((double)a[i].c,mid));
}
int cur[N];
int d[N],vis[N],q[N],head,tail;
bool bfs(){memset(vis,0,sizeof(vis));memset(d,0,sizeof(d));head=tail=1;d[s]=0;vis[s]=1;q[tail++]=s;while(head!=tail){int u=q[head++];for(int i=h[u];i;i=e[i].ne){int v=e[i].v;if(!vis[v]&&e[i].c>e[i].f){d[v]=d[u]+1;vis[v]=1;q[tail++]=v;if(v==t) return 1;}}}return 0;
}double dfs(int u,double a){if(u==t||a==0) return a;double flow=0,f;for(int &i=cur[u];i;i=e[i].ne){int v=e[i].v;if(d[v]==d[u]+1&&(f=dfs(v,min(a,e[i].c-e[i].f)))>0){flow+=f;e[i].f+=f;e[((i-1)^1)+1].f-=f;a-=f;if(a==0) break;}}return flow;
}
double dinic(){double flow=0;while(bfs()){for(int i=1;i<=n;i++) cur[i]=h[i];flow+=dfs(s,INF);}return flow;
}
int main(int argc, const char * argv[]) {n=read();m=read();p=read();s=1;t=n;double l=0,r=0;for(int i=1;i<=m;i++){a[i].u=read(),a[i].v=read(),a[i].c=read();ins(a[i].u,a[i].v,a[i].c);r=max(r,(double)a[i].c);}//r+=eps;double old=dinic();while(r-l>eps){double mid=(l+r)*0.5;//printf("%f %f\n",l,r);
        build(mid);double mx=dinic();if(fabs(mx-old)<eps) r=mid;else l=mid;}printf("%d\n%.4f",(int)old,l*p);return 0;
}

 

 

 

 

转载于:https://www.cnblogs.com/candy99/p/6103372.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373394.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux Shell 003-变量

Linux Shell 003-变量 本节关键字&#xff1a;Linux、Shell、变量、全局变量、系统变量 相关指令&#xff1a;read、echo、unset、export 变量的含义 变量是用来临时保存数据的&#xff0c;该数据是可以变化的数据。如果某个内容需要多次使用&#xff0c;并且在代码中重复出现…

Java自动机实现

这篇文章将解决在Java中实现有限状态机的问题。 如果您不知道什么是FSM或在什么地方可以使用FSM&#xff0c;您可能会热衷于阅读此 &#xff0c; 这个和这个 。 如果您发现自己在设计上使用FSM的情况&#xff0c;则可能已经开始为实现相同接口的每个状态编写类。 一个好的设计可…

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files这个文件找不到

在C:\Windows\Microsoft.NET\Framework64\v4.0.30319文件夹下面建立Temporary ASP.NET Files 文件夹&#xff08;Framework64 注意64&#xff0c;这个可能是我们用的64位系统&#xff0c;但是vs2010不分32位还是64位&#xff0c;所以在C:\Windows\Microsoft.NET\Framework\v4.0…

java电脑运行视频演示_javaweb视频第一天(二)

无论通过哪种方式得到的class类对象&#xff0c;是同一个。比较的是地址码这里教会你&#xff1a;如何去使用class对象现在就知道这个&#xff1a;如何使用反射&#xff0c;并且说反射是实现了什么样的功能。如何通过反射得到里面的相应字段&#xff0c;得到里面的相应函数等等…

模型驱动 ModelDriven

ModelDriven:模型驱动,对所有action的模型对象进行批处理. 我们在开发中&#xff0c; 在action中一般是用实体对象&#xff0c;然后给实体对象get&#xff0c;set方法。 RegAction{   User user ;   //get/set} 然后在jsp页面中给action中的user属性绑定值是通过如下方式 &…

本月风味– Neo4j和Heroku

Neo4j今年早些时候发起了一项挑战&#xff0c;即“ 种子播云 ”&#xff0c;以使人们使用Neo4j附加组件在Heroku上创建模板或演示应用程序。 经过许多内部辩论之后&#xff0c;我决定进入&#xff0c;但由于缺乏想法而陷入绝望。 当我什么都没做的时候&#xff0c;这个主意就出…

1 + 11 + 1111+ 11111+ ..... + 11111(2016个) 结果是几位数

# -*- coding: utf-8 -*- """ Created on Mon Mar 21 20:38:06 2016author: yanjie """1 11 1111 11111 ..... 11111(2016个) 结果是几位数 用什么数据结构 有几个6 写算法a []; m 0; six 0; for i in range(2016,0,-1):b (im) % 10;m (…

[回归分析][10]--相关误差的问题

[回归分析][10]--相关误差的问题这一篇文章还是来分析相关误差的问题。 1.游程数 定义&#xff1a;游程数--残差穿过x-轴的次数 用这个可以检查如残差有一块在x轴上面&#xff0c;一块在x轴下面的情形。 如上面这样的残差 下面构造两个统计量&#xff1a; 其中 n…

Spring 3 MVC异常处理程序

我遇到的大多数Spring 3错误处理示例代码似乎都提供了其用法的最简单概述&#xff0c;但是&#xff0c;有人说&#xff0c;如何处理错误比正常代码的工作方式更为重要。 前一天&#xff0c;当我在Spring&#xff08;2&#xff09;错误处理程序中遇到一个简单的GOTCHA时&#xf…

java编译找不到符号_javac编译时找不到符号?

我是个新手&#xff0c;在linux使用java编程时&#xff0c;出现这个情况。我把要引的包放在classpath中&#xff0c;红色部分&#xff1a;export CLASSPATH.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$HADOOP_HOME/hadoop-1.0.4.core.jar:${CLASSPATH}通过echo $CLASSP…

全备份、差异备份和增量备份概念详述

全备份、差异备份和增量备份概念详述 1、完全备份&#xff08;Full Backup&#xff09; 备份全部选中的文件夹&#xff0c;并不依赖文件的存档属性来确定备份那些文件。在备份过程中&#xff0c;任何现有的标记都被清除&#xff0c;每个文件都被标记为已备份。换言之&#xff0…

微信接入登录功能access_token流程记录

提示&#xff1a;只有认证过的订阅号或者服务号才能获取access_token。 1.app微信登录第一步是&#xff0c;app调起来微信客户端&#xff0c;通过app端的配置&#xff0c;引入一个微信类库&#xff0c; 2.授权成功后&#xff0c;微信会返回你一个code。 将APP_ID替换成你在微信…

使用MVC模式制作游戏-教程和简介

游戏开发中一种有用的体系结构模式是MVC&#xff08;模型视图控制器&#xff09;模式。 它有助于分离输入逻辑&#xff0c;游戏逻辑和UI&#xff08;渲染&#xff09;。 在任何游戏开发项目的早期阶段&#xff0c;其实用性很快就会被注意到&#xff0c;因为它允许快速更改内容&…

boost

参考博客 http://www.cnblogs.com/lidabo/p/3805487.html http://www.cppblog.com/Robertxiao/archive/2013/01/06/197022.html http://www.cnblogs.com/finallyliuyu/archive/2013/05/23/3094246.html http://www.cnblogs.com/lidabo/p/3782193.html http://www.cnblogs.com/z…

moment格式换时间_不一样的日期、时间转换(moment.js)

无意中遇到了一种很奇怪的日期格式&#xff0c;从接口中返回的日期是这样的&#xff0c;如 2018-02-06T11:59:2208:00 。然而这却不是我们想要的&#xff0c;我们要的是这种&#xff0c;YYYY-MM-DD HH:mm:ss。那么这种是怎么转换的呢&#xff1f;这时候就可以使用一款很好用的日…

并发模式:生产者和消费者

在我15年的职业生涯中&#xff0c;生产者和消费者的问题是我仅遇到过几次。 在大多数编程情况下&#xff0c;我们正在做的事情是以同步方式执行功能&#xff0c;其中JVM或Web容器自行处理多线程的复杂性。 但是&#xff0c;在编写某些需要的用例时。 上周&#xff0c;我遇到了一…

POJ 1006 - Biorhythms (中国剩余定理)

B - BiorhythmsTime Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Submit Status Practice POJ 1006Description 人生来就有三个生理周期&#xff0c;分别为体力、感情和智力周期&#xff0c;它们的周期长度为23天、28天和33天。每一个周期中…

子线程中更新UI线程的三个方法

1、通过handler方式&#xff0c;sendmessage。 多个类间传递比较麻烦&#xff0c;也懒的写... 2、线程中通过runOnUiThread&#xff08;&#xff09; new Thread() { public void run() { //这儿是耗时操作&#xff0c;完成之后更新UI&#xff1b; runOnUiThread(new Runnab…

mysql limit acs_mysql查询操作

简单查询&#xff1a;select * from 表名;避免重复&#xff1a;select distinct 字段 from 表名;条件查询&#xff1a;select 字段,字段 from 表名 where id<5(条件);四则运算查询&#xff1a;select id,dep_id,id*dep_id from company.employee5 where id<5;定义显示格式…

作业管理系统数据字典

转载于:https://www.cnblogs.com/heyangcan/p/5312394.html