01分数规划+最大权闭合子图 
倒拓扑序处理每个节点

$$f[x]=\frac{\sum{f[v]}}{n}+1$$

二分答案$val$

只需要判断是否存在$\sum{f[v]}+1-val>0$即可 
点权下放给边,限制${x,y}$即为若边$x$存在,则边$y$存在 
建图,跑网络流即可

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#define inf 0x7fffffff
#define eps 1e-7
using namespace std; namespace network{
const int N = ;
const int S = ;
const int T = ;
int e=,head[N];
struct edge{
int u,v,next;
double f;
}ed[];
void add(int u,int v,double f){
ed[e].u=u;ed[e].v=v;ed[e].f=f;
ed[e].next=head[u];head[u]=e++;
ed[e].u=v;ed[e].v=u;ed[e].f=;
ed[e].next=head[v];head[v]=e++;
}
int dep[N];
int q[N],h,t;
bool bfs(){
memset(dep,-,sizeof dep);
dep[S]=; h=t=; q[]=S;
while(h<=t){
int x=q[h++];
for(int i=head[x];i;i=ed[i].next){
if(ed[i].f&&dep[ed[i].v]==-){
dep[ed[i].v]=dep[x]+;
q[++t]=ed[i].v;
}
}
}
return dep[T]!=-;
}
double dfs(int x,double f){
if(x==T||f==)return f;
double ans=;
for(int i=head[x];i;i=ed[i].next){
if(ed[i].f&&dep[ed[i].v]==dep[x]+){
double nxt=dfs(ed[i].v,min(f,ed[i].f));
ed[i].f-=nxt; ed[i^].f+=nxt;
f-=nxt; ans+=nxt;
if(f==)break;
}
}
if(ans==)dep[x]=-;
return ans;
}
double dinic(){
double ans=;
while(bfs())ans+=dfs(S,inf);
return ans;
}
void init(){memset(head,,sizeof head);e=;}
} namespace graph{
const int N =;
int e=,head[N],out[N];
vector<int> lim[N];
bool vis[N];
double f[N];
struct edge{
int u,v,next;
}ed[*N];
void add(int u,int v){
ed[e].u=u;ed[e].v=v;
ed[e].next=head[u];
head[u]=e++;out[u]++;
}
bool check(int x,double y){
network::init();
double sum=;
for(int i=head[x];i;i=ed[i].next){
int v=ed[i].v;
double val=f[v]+-y;
sum+=max(val,(double));
if(val>)network::add(network::S,i,val);
else network::add(i,network::T,-val);
for(int j=;j<lim[i].size();j++)
network::add(i,lim[i][j],(double)inf);
}
return sum-network::dinic()>;
}
double solve(int x){
if(!out[x])return 0.0;
double l=,r=,mid,ans;
for(int i=head[x];i;i=ed[i].next)
r=max(r,f[ed[i].v]+);
while(r-l>=eps){
mid=(l+r)/2.0;
if(check(x,mid))l=ans=mid;
else r=mid;
}
return ans;
}
void work(int x){
for(int i=head[x];i;i=ed[i].next)
if(!vis[ed[i].v]){
work(ed[i].v);
vis[ed[i].v]=;
}
f[x]=solve(x);
}
} int main(){
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
for(int i=,u,v;i<=m;i++){
scanf("%d%d",&u,&v);
graph::add(u,v);
}
for(int i=,x,y;i<=k;i++){
scanf("%d%d",&x,&y);
graph::lim[x].push_back(y);
}
graph::work();
printf("%lf\n",graph::f[]);
}
/*
3 3 1
1 2
1 3
2 3
1 2
*/

bzoj 4501 旅行的更多相关文章

  1. bzoj 4501: 旅行 01分数规划+概率期望dp

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=4501 题解: 首先我们不考虑可以删除边的情况下,如何计算期望边数. 然后我们发现这是个有 ...

  2. bzoj 3531 旅行

    动态开点线段树+树链剖分  对于每一种宗教信仰都开一颗线段树 空间: QlogN 即每一次修改都只会改变logN 个点 时间 O(QlogN)  naive题  边没有开两倍  QAQ bzoj 35 ...

  3. BZOJ 1050 旅行comf(枚举最小边-并查集)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1050 题意:给出一个带权图.求一条s到t的路径使得这条路径上最大最小边的比值最小? 思路 ...

  4. BZOJ 2157 旅行

    裸链剖. 这大概是我第一份两百行左右的代码吧. 然而我把题看错了233333333调了将近两天. #include<iostream> #include<cstdio> #in ...

  5. BZOJ 1050 旅行

    Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T,求一条路径,使得路径上最大 ...

  6. BZOJ 1050 旅行comf

    题目如下: 题目描述 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T,求一条路径,使得路径上最大边 ...

  7. BZOJ 2388: 旅行规划 [分块 凸包 等差数列]

    传送门 题意: 区间加和询问一段区间内整体前缀和的最大值 刚才还在想做完这道题做一道区间加等差数列结果发现这道就是.... 唯一的不同在于前缀和一段区间加上等差数列后,区间后面也要加上一个常数!!! ...

  8. [BZOJ]1050 旅行comf(HAOI2006)

    图论一直是小C的弱项,相比其它题型,图论的花样通常会更多一点,套路也更难捉摸. Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权 ...

  9. BZOJ.3531.旅行(树链剖分 动态开点)

    题目链接 无优化版本(170行): /* 首先树剖可以维护树上的链Sum.Max 可以对每个宗教建一棵线段树,那这题就很好做了 不过10^5需要动态开点 (不明白为什么nlogn不需要回收就可以 不是 ...

随机推荐

  1. java泛型应用实例 - 自定义泛型类,方法

    近 短时间需要使用泛型,就研究了下,发现网上的问关于泛型的文章都是讲原理的, 很少有提到那里用泛型比较合适, 本文就泛型类和泛型方法的使用给出两 个典型应用场景. 例如一个toString的泛型方法, ...

  2. JAVA堆栈的区别

    1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆.              2. 栈的优势是,存取速度 ...

  3. CAN数据格式-ASC

    Vector工具录制的数据,一般有ASC和BLF两种格式,本文介绍ASC. 1. ASC定义 ASC(ASCII)即文本文件,数据已可视化的文本存储. 2.ASC查看 通常情况下,用记事本就可以打开. ...

  4. Spring AOP四种实现方式Demo详解与相关知识探究

    一.前言 在网络上看到一篇博客Spring实现AOP的4种方式,博主写的很通俗易懂,但排版实在抓狂,对于我这么一个对排版.代码格式有强迫症的人来说,实在是不能忍受~~~~(>_<)~~~~ ...

  5. 自动红眼移除算法 附c++完整代码

    说起红眼算法,这个话题非常古老了. 百度百科上的描述: "红眼"一般是指在人物摄影时,当闪光灯照射到人眼的时候,瞳孔放大而产生的视网膜泛红现象. 由于红眼现象的程度是根据拍摄对象色 ...

  6. C++std函数之transform

    /*//////////////////////////////// template < class InputIterator, class OutputIterator, class Un ...

  7. jtds驱动更新对一个老问题的解决

    07年年末的一篇blog: 以前网站做初期开发时,有一个问题:hibernate下text大字符串读取时出这个异常:JDBCExceptionReporter - The amount of data ...

  8. Android 加载GIF图最佳实践

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/75578109 本文出自[赵彦军的博客] 起因 最近在项目中遇到需要在界面上显示一个 ...

  9. iframe 背景透明设置--兼容IE

    iframe标签添加: allowTransparency="true"属性. 子文件body背景设置透明: background-color: transparent;.

  10. mysql 基本命令操作

    1. 查看存储引擎 show engines; 2. 查看数据存储位置 show variables like 'datadir': 3. 存储引擎 create table mytest engin ...