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不需要回收就可以 不是 ...
随机推荐
- 遍历输出图片加hover
1. $(".icon a>div").hover(function () { var slls = $(this).attr("class"); sll ...
- 超强js博客值得学习!!!
再读ecmascript 摘要: 这几天,又花了点时间看了下ecmascript.以下是我摘录出来的一些理解.在此记录下.第一部分:关于变量对象的理解1) 什么是变量对象?数据的存取与读取机制,就是变 ...
- Day8 接口与归一化设计
接口:在程序的使用中,我不能把程序的主体直接提供给使用者,一般是提供一个接口. 为什么要使用接口: 1,接口提取了一群共同的函数,可以把接口当做一个函数的集合. 2,让子类去实现接口中的函数. 归一化 ...
- Mysql系列-数据库
一 .数据库管理软件的由来 基于我们之前所学,数据要想永久保存,都是保存于文件中,毫无疑问,一个文件仅仅只能存在于某一台机器上. 如果我们暂且忽略直接基于文件来存取数据的效率问题,并且假设程序所有的组 ...
- Angular TypeScript开发环境集成jQuery扩展插件
集成步骤: 1.安装jquery极其扩展插件库ts定义文件 npm install jquery --save npm install --save-dev @types/jquery npm ins ...
- GPU计算的十大质疑—GPU计算再思考
http://blog.csdn.NET/babyfacer/article/details/6902985 原文链接:http://www.hpcwire.com/hpcwire/2011-06-0 ...
- Git忽略远程已存在的文件
git设置本地忽略时远程上不存在本地忽略的文件,git将忽略.如果远程分支上存在这个文件,本地在设置ignore将不起作用.换句话说git本地忽略文件必须保证git的远程仓库分支上没有这个要忽略的文件 ...
- Oracle12c中数据泵新特性之功能增强(expdp, impdp)
Oracle的数据泵功能在10g中被引进.本文对数据泵在12c中的增强做一个概览. 1. 禁用日志选项(DISABLE_ARCHIVE_LOGGING) Impdp的TRANSFORM参数已经扩展 ...
- lambda函数常见用法
# lambda 参数:返回值/表达式 # print((lambda :100)()) # f = lambda a,b : a + b # print(f(10, 20)) # f = lambd ...
- 重温《STL源码剖析》笔记 第四章
源码之前,了无秘密 ——侯杰 序列式容器 关联式容器 array(build in) RB-tree vector set heap map priority-queue multiset li ...