bzoj 4501 旅行
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 旅行的更多相关文章
- bzoj 4501: 旅行 01分数规划+概率期望dp
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=4501 题解: 首先我们不考虑可以删除边的情况下,如何计算期望边数. 然后我们发现这是个有 ...
- bzoj 3531 旅行
动态开点线段树+树链剖分 对于每一种宗教信仰都开一颗线段树 空间: QlogN 即每一次修改都只会改变logN 个点 时间 O(QlogN) naive题 边没有开两倍 QAQ bzoj 35 ...
- BZOJ 1050 旅行comf(枚举最小边-并查集)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1050 题意:给出一个带权图.求一条s到t的路径使得这条路径上最大最小边的比值最小? 思路 ...
- BZOJ 2157 旅行
裸链剖. 这大概是我第一份两百行左右的代码吧. 然而我把题看错了233333333调了将近两天. #include<iostream> #include<cstdio> #in ...
- BZOJ 1050 旅行
Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T,求一条路径,使得路径上最大 ...
- BZOJ 1050 旅行comf
题目如下: 题目描述 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T,求一条路径,使得路径上最大边 ...
- BZOJ 2388: 旅行规划 [分块 凸包 等差数列]
传送门 题意: 区间加和询问一段区间内整体前缀和的最大值 刚才还在想做完这道题做一道区间加等差数列结果发现这道就是.... 唯一的不同在于前缀和一段区间加上等差数列后,区间后面也要加上一个常数!!! ...
- [BZOJ]1050 旅行comf(HAOI2006)
图论一直是小C的弱项,相比其它题型,图论的花样通常会更多一点,套路也更难捉摸. Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权 ...
- BZOJ.3531.旅行(树链剖分 动态开点)
题目链接 无优化版本(170行): /* 首先树剖可以维护树上的链Sum.Max 可以对每个宗教建一棵线段树,那这题就很好做了 不过10^5需要动态开点 (不明白为什么nlogn不需要回收就可以 不是 ...
随机推荐
- Python_如何去除字符串里的空格
个人想到的解决方法有两种,一种是 .replace(' old ',' new ') 第一个参数是需要换掉的内容比如空格,第二个是替换成的内容,可以把字符串中的空格全部替换掉. 第二种方法是像这样 ...
- permutations II(全排列 2)
题目要求 Given a collection of numbers that might contain duplicates, return all possible unique permuta ...
- JVM的运行原理以及JDK 7增加的新特性(一)
虚拟机(Virtual Machine) JRE是由Java API和JVM组成的.JVM的主要作用是通过Class Loader来加载Java程序,并且按照Java API来执行加载的程序. 虚拟机 ...
- Ubuntu12.04下Django1.4的删除目录
网上有很多文章说这个问题,大意就是下载压缩包以后用 sudo python setup.py install 上面这条命令安装的Django,然后到相关目录下把那个Django的目录删掉就Ok了,但是 ...
- Django1.10 release notes摘编
一.重点新特性: 1.面向PostgreSQL的全文搜索支持 2.新式风格的middleware 3.用户名Unicode编码的官方支持 二.一些可以提的改变: 1.用户名最大长度增加到150 2.不 ...
- 基于Kurento的WebRTC移动视频群聊技术方案
说在前面的话:视频实时群聊天有三种架构: Mesh架构:终端之间互相连接,没有中心服务器,产生的问题,每个终端都要连接n-1个终端,每个终端的编码和网络压力都很大.群聊人数N不可能太大. Router ...
- 利用HTML5,前端js实现图片压缩
http://blog.csdn.NET/qazwsx2345/article/details/21827553 主要用了两个HTML5的 API,一个file,一个canvas,压缩主要使用cnav ...
- 分享一个开源的网盘下载工具BaiduPCS-Go
大家在使用网盘的时候,一定忍受不了限速下载的速度.今天给大家分享一个开源的网盘下载项目BaiduPCS-Go.Go语言编写,仿 Linux shell 文件处理命令的百度网盘命令行客户端.多平台支持, ...
- 拾人牙慧篇之———QQ微信的第三方登录实现
一.写在前面 关于qq微信登录的原理之流我就不一一赘述了,对应的官网都有,在这里主要是展示我是怎么实现出来的,看了好几个博客,有的是直接复制官网的,有的不知道为什么实现不了.我只能保证我的这个是我实现 ...
- Leetcode_删除排序数组中的重复项
Leetcode 删除排序数组中的重复项 题目: 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用 额外的数组空间,你必须在原地修改输入数 ...