题目大意:

http://www.lydsy.com/JudgeOnline/problem.php?id=4501

题解:

首先我们不考虑可以删除边的情况下,如何计算期望边数.

然后我们发现这是个有向无环图

所以直接\(f[u] = \sum\frac{f[v] + 1}{deg_u}\)直接计算即可

然后我们考虑如果允许删除边

注意这句话

保证对于每个限制(x,y),第x条边和第y条边的起点是相同的

所以可以分别考虑每次转移

这时候我们考虑如何决策才能最优化\(f[u]\)

即最优化\(\sum\frac{f[v] + 1}{deg_u}\)

将式子变形:\(\frac{\sum(f[v] + 1)x_i}{\sum x_i}\)

我们发现这是一个分式,所以可以利用01分数规划来最大化取值

所以我们有\(f(L) = \sum d_ix_i > 0\)时存在更优值,\(d_i = (f_i + 1) - L\)

所以利用01分数规划,问题转化成了最大化\(\sum d_ix_i\)

这个问题可以转化为一个最小割模型(最大权闭合子图),跑网络流即可.

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline void read(int &x){
x=0;char ch;bool flag = false;
while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
const int maxm = 512;
const int maxk = 2048;
const double eps = 1e-6;
const double inf = 1e8;
namespace net{
struct Edge{
int to,next;
double cap;
}G[(maxk<<1) + (maxm<<1) + 1010];
int head[(maxm<<1) + 100],cnt = 1;
void add(int u,int v,double d){
G[++cnt].to = v;
G[cnt].next = head[u];
head[u] = cnt;
G[cnt].cap = d;
}
inline void insert(int u,int v,double d){
add(u,v,d);add(v,u,0);
}
#define v G[i].to
int q[(maxm<<1) + 100],l,r;
int dis[(maxm<<1) + 100],S,T;
bool bfs(){
memset(dis,-1,sizeof dis);
l = 0;r = -1;q[++r] = S;
dis[S] = 0;
while(l <= r){
int u = q[l++];
for(int i = head[u];i;i=G[i].next){
if(dis[v] == -1 && G[i].cap > eps){
dis[v] = dis[u] + 1;
q[++r] = v;
}
}
}
return dis[T] != -1;
}
double dfs(int u,double f){
if(u == T || f < eps) return f;
double ret = 0;
for(int i = head[u];i;i=G[i].next){
if(dis[v] == dis[u] + 1 && G[i].cap > eps){
double x = dfs(v,min(G[i].cap,f));
ret += x;f -= x;
G[i].cap -= x;
G[i^1].cap += x;
if(f < eps) break;
}
}
return ret;
}
#undef v
void clear(){
memset(head,0,sizeof head);cnt = 1;
S = (maxm<<1) - 5;T = S + 1;
}
double main(){
double ret = 0;
while(bfs()){
ret += dfs(S,inf);
}return ret;
}
}
namespace dp0{
struct Edge{
int to,next;
}G[maxm<<1],lim[maxk<<1];
int head[maxm],edli[maxm<<1];
int cnt,ct;
void add_ed(int u,int v){
G[++cnt].to = v;
G[cnt].next = head[u];
head[u] = cnt;
}
void add_li(int u,int v){
lim[++ct].to = v;
lim[ct].next = edli[u];
edli[u] = ct;
}
double d[maxm],f[maxm];
inline bool check(int u,double mid,int fa){
net::clear();
double total = .0;
for(int i = head[u];i;i=G[i].next){
if(G[i].to == fa) continue;
d[i] = f[G[i].to] - mid + 1;
if(d[i] > eps){
total += d[i];
net::insert(i,net::T,d[i]);
}else if(d[i] < -eps){
net::insert(net::S,i,-d[i]);
}
for(int v = edli[i];v;v=lim[v].next){
net::insert(i,lim[v].to,inf);
}
}
total -= net::main();
return total > eps;
}
inline double work(int u,int fa){
double l = .0,r = inf;
while(r-l > eps){
double mid = (l+r)/2.0;
if(check(u,mid,fa)) l = mid;
else r = mid;
}return l;
}
#define v G[i].to
void dfs(int u,int fa){
if(head[u] == 0) return;
if(f[u] > eps) return;
f[u] = .0;
for(int i = head[u];i;i = G[i].next){
if(v == fa) continue;
dfs(v,u);
}
f[u] = work(u,fa);
return ;
}
#undef v
int main(){
int n,m,k;read(n);read(m);read(k);
for(int i=1,u,v;i<=m;++i){
read(u);read(v);
add_ed(u,v);
}
for(int i=1,u,v;i<=k;++i){
read(u);read(v);
add_li(v,u);
}
dfs(1,0);
printf("%.12lf\n",f[1]);
return 0;
}
}
int main(){
dp0::main();
getchar();getchar();
return 0;
}

bzoj 4501: 旅行 01分数规划+概率期望dp的更多相关文章

  1. BZOJ.4753.[JSOI2016]最佳团体(01分数规划 树形背包DP)

    题目链接 \(Description\) 每个点有费用si与价值pi,要求选一些带根的连通块,总大小为k,使得 \(\frac{∑pi}{∑si}\) 最大 \(Solution\) 01分数规划,然 ...

  2. bzoj 3029 守卫者的挑战——概率期望dp+状态数思考

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3029 先随便写了个dfs,记录“前 i 次.成功 j 次.容量-残片=k”的概率.因为是否可 ...

  3. bzoj 1690: [Usaco2007 Dec]奶牛的旅行【01分数规划+spfa】

    把add传参里的double写成int我也是石乐志-- 首先这个东西长得就很01分数规划 然后我不会证为什么没有8字环,我们假装他没有 那么设len为环长 \[ ans \leq \frac{\sum ...

  4. 【BZOJ】1690: [Usaco2007 Dec]奶牛的旅行(分数规划+spfa)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1690 第一题不是水题的题.. 分数规划.. T-T 百度吧..http://blog.csdn.ne ...

  5. BZOJ.4819.[SDOI2017]新生舞会(01分数规划 费用流SPFA)

    BZOJ 洛谷 裸01分数规划.二分之后就是裸最大费用最大流了. 写的朴素SPFA费用流,洛谷跑的非常快啊,为什么有人还T成那样.. 当然用二分也很慢,用什么什么迭代会很快. [Update] 19. ...

  6. bzoj 3597: [Scoi2014]方伯伯运椰子 [01分数规划 消圈定理 spfa负环]

    3597: [Scoi2014]方伯伯运椰子 题意: from mhy12345 给你一个满流网络,对于每一条边,压缩容量1 需要费用ai,扩展容量1 需要bi, 当前容量上限ci,每单位通过该边花费 ...

  7. 【BZOJ 4819】 4819: [Sdoi2017]新生舞会 (0-1分数规划、二分+KM)

    4819: [Sdoi2017]新生舞会 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 601  Solved: 313 Description 学校 ...

  8. 【BZOJ】4753: [Jsoi2016]最佳团体 01分数规划+树上背包

    [题意]n个人,每个人有价值ai和代价bi和一个依赖对象ri<i,选择 i 时 ri 也必须选择(ri=0时不依赖),求选择k个人使得Σai/Σbi最大.n<=2500,ai,bi< ...

  9. BZOJ 1486 最小圈(01分数规划)

    好像是很normal的01分数规划题.最小比率生成环. u(c)=sigma(E)/k.转化一下就是k*u(c)=sigma(E). sigma(E-u(c))=0. 所以答案对于这个式子是有单调性的 ...

随机推荐

  1. CSS3 线性渐变(linear-gradient)

    CSS3 Gradient 分为 linear-gradient(线性渐变)和 radial-gradient(径向渐变).而我们今天主要是针对线性渐变来剖析其具体的用法.为了更好的应用 CSS3 G ...

  2. 【BZOJ4128】Matrix BSGS+hash

    [BZOJ4128]Matrix Description 给定矩阵A,B和模数p,求最小的x满足 A^x = B (mod p) Input 第一行两个整数n和p,表示矩阵的阶和模数,接下来一个n * ...

  3. 基于镜像安装mysql

    准备目录 cd /opt mkdir -p mysql/data mysql/logs mysql/conf 查找MySql镜像版本 docker search mysql 安装指定版本的mysql镜 ...

  4. python基础-第六篇-6.4模块混战

    我们之前接触多的编程方式就是函数式编程,而且喜欢就一个文件里写完所有的程序代码,这样做在前期感觉还不错,不过一旦你的程序变复杂,在易读性和排错方面就感觉好吃力,功能界限不明显,那今天我们就来讲讲怎么用 ...

  5. Jquery点击事件出发顺序

    鼠标点击触发事件执行顺序: mouse down -> mouse up -> click 键盘点击出发事件执行顺序: 点击后马上抬起:key down -> key press - ...

  6. centos install docker setup centos7 安装docker

    centos7 安装docker 1: 安装必要的一些系统工具sudo yum install -y yum-utils device-mapper-persistent-data lvm2 2: 添 ...

  7. python初学者总结

    学习python首先配置好工作环境,因为不同版本之间的python是不兼容了 原创:01coding.com win7安装环境过程: 1:下载python 建议下载两个不同版本官方已给出 https: ...

  8. java访问微信接口发送消息

    最近在开发activiti流程的时候有个需求:流程到达每个审批节点后,需要向该节点的审批人发送一个消息,提示有审批需要处理. 参考了一下微信的开发者文档和网络上的一些技术博客,现在记录一下.以便后续继 ...

  9. 数据分析R语言(1)

    无意中发现网上的一个数据分析R应用教程,看了几集感觉还不错,本文做一个学习笔记(知识点来源:视频内容+R实战+自己的理解),视频详细的信息请参考http://www.itao521.com/cours ...

  10. 运行“cordova build android” - 无法找到属性android:fontVariationSettings和android:ttcIndex

    :app:processArm64DebugResourcesC:\Users\xfcao\.gradle\caches\transforms-1\files-1.1\xwalk_core_libra ...