bzoj3876: [Ahoi2014]支线剧情
神犇题解:http://blog.csdn.net/popoqqq/article/details/43024221
题意:给定一个DAG,1为起始点,任意一个点可以直接回到1,每条边有经过代价,求一种最优方案使得每条边至少经过一次,代价最小。
无源汇有下界最小费用可行流。
考虑我们对于无源汇的建图:对于每个点,它的入度下界为容量,S向它拉一条边,出度下界为容量,其向T连一条边,跑一边最大流即可。
这里我们建图实际上一样,但是加上了费用,具体建图如下:
对于x->y,费用为z
S向y建容量为1,费用为z的边(对应无源汇里的入度处理)
x向y建容量INF,费用为z的边(即自由流)
对于每一个点x,假设其出度为a
x向T建容量为a,费用为0的边(出度处理)(注意这里不要加上费用,因为已经在入度处理的时候就加过了)
x向1建容量INF,费用为0的边(对应题意)
然后跑最小费用流就可以了。
膜拜ihopenot大爷。
实际上有一个很大的建图优化,也是无源汇建图的优化,即合并入出度并且相互抵消。但是对于这道题就不好做,因为有费用,不过可以这么想:既然每一条边都要走,我们就直接把费用抽出来,即答案一开始就为所有边走一次的代价,然后这样入度的费用就变为0了。然后再与出度进行抵消,最后边的数量大大减少。
实践证明,从原来改到现在,时间从8000多优化到100多ms。
#include<bits/stdc++.h>
using namespace std;
#define N 50005
#define INF 1e9
inline int read(){
int x=,f=;char a=getchar();
while(a<'' || a>'') {if(a=='-') f=-; a=getchar();}
while(a>='' && a<='') x=x*+a-'',a=getchar();
return x*f;
}
int ans,n,cnt,a[N],p[N],d[N],head[N],S,T;
bool vis[N];
queue<int>q;
struct edges{
int fr,to,cap,flow,cost,next;
}e[*N];
inline void insert(int u,int v,int f,int c){
e[cnt]=(edges){u,v,f,,c,head[u]};head[u]=cnt++;
e[cnt]=(edges){v,u,,,-c,head[v]};head[v]=cnt++;
}
inline bool spfa(){
memset(d,0x3f,sizeof(d));
d[S]=; a[S]=INF; q.push(S);
while(!q.empty()){
int x=q.front(); q.pop(); vis[x]=;
for(int i=head[x];i>=;i=e[i].next)
if(d[e[i].to]>d[x]+e[i].cost && e[i].flow<e[i].cap){
d[e[i].to]=d[x]+e[i].cost; p[e[i].to]=i;
a[e[i].to]=min(a[x],e[i].cap-e[i].flow);
if(!vis[e[i].to]) vis[e[i].to]=,q.push(e[i].to);
}
}
return d[T]<INF;
}
inline void mincf(){
ans+=a[T]*d[T];
int u=T;
while(u!=S){
e[p[u]].flow+=a[T];
e[p[u]^].flow-=a[T];
u=e[p[u]].fr;
}
}
int main(){
memset(head,-,sizeof(head));
n=read(); S=; T=n+;
for(int a,i=;i<=n;i++){
a=read(); insert(i,T,a,);
if(i!=) insert(i,,INF,);
for(int to,co,j=;j<=a;j++)
to=read(),co=read(),insert(i,to,INF,co),insert(S,to,,co);
}
while(spfa()) mincf();
printf("%d\n",ans);
return ;
}
优化建图:
for(int a,i=;i<=n;i++){
a=read(); cd[i]=a;
if(i!=) insert(i,,INF,);
for(int to,co,j=;j<=a;j++)
to=read(),co=read(),ans+=co,r[to]++,insert(i,to,INF,co);
}
for(int i=;i<=n;i++)
if(r[i]>cd[i]) insert(S,i,r[i]-cd[i],);
else insert(i,T,cd[i]-r[i],);
bzoj3876: [Ahoi2014]支线剧情的更多相关文章
- [bzoj3876][AHOI2014]支线剧情——上下界费用流
题目 传送门 题解 建立s和t,然后s向1连下限0上限inf费用0的边,除1外所有节点向t连下限0上限inf费用0的边,对于每条边下限为1上限为inf费用为经过费用,然后我们只有做上下界网络流构出新图 ...
- 【BZOJ3876】[Ahoi2014]支线剧情 有上下界费用流
[BZOJ3876][Ahoi2014]支线剧情 Description [故事背景] 宅男JYY非常喜欢玩RPG游戏,比如仙剑,轩辕剑等等.不过JYY喜欢的并不是战斗场景,而是类似电视剧一般的充满恩 ...
- 【BZOJ-3876】支线剧情 有上下界的网络流(有下界有源有汇最小费用最大流)
3876: [Ahoi2014]支线剧情 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 821 Solved: 502[Submit][Status ...
- C++之路进阶——bzoj3876(支线剧情)
F.A.Qs Home Discuss ProblemSet Status Ranklist Contest ModifyUser hyxzc Logout 捐赠本站 Notice:由于本OJ建立在 ...
- bzoj 3876 [Ahoi2014]支线剧情(有上下界的最小费用流)
3876: [Ahoi2014]支线剧情 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 484 Solved: 296[Submit][Status ...
- BZOJ 3876: [Ahoi2014]支线剧情 [上下界费用流]
3876: [Ahoi2014]支线剧情 题意:每次只能从1开始,每条边至少经过一次,有边权,求最小花费 裸上下界费用流...每条边下界为1就行了 注意要加上下界*边权 #include <io ...
- BZOJ 3876: [Ahoi2014]支线剧情 带下界的费用流
3876: [Ahoi2014]支线剧情 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=3876 Description [故事背景] 宅 ...
- [Ahoi2014]支线剧情[无源汇有下界最小费用可行流]
3876: [Ahoi2014]支线剧情 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1538 Solved: 940[Submit][Statu ...
- 【BZOJ3876】 [Ahoi2014]支线剧情
Description [故事背景] 宅男JYY非常喜欢玩RPG游戏,比如仙剑,轩辕剑等等.不过JYY喜欢的并不是战斗场景,而是类似电视剧一般的充满恩怨情仇的剧情.这些游戏往往 都有很多的支线剧情,现 ...
随机推荐
- 如何在R语言中使用Logistic回归模型
在日常学习或工作中经常会使用线性回归模型对某一事物进行预测,例如预测房价.身高.GDP.学生成绩等,发现这些被预测的变量都属于连续型变量.然而有些情况下,被预测变量可能是二元变量,即成功或失败.流失或 ...
- R语言基本操作函数---变量的基本操作
1.变量变换 as.array(x),as.data.frame(x),as.numeric(x),as.logical(x),as.complex(x),as.character(x) ...
- VM出现该虚拟机正在使用中的提示,让获取所有权限解决办法
今天打开虚拟机正要学习,结果说是虚拟机似乎正在使用中,让我重新获取权限.解决办法:打开提示的配置文件的位置,将一个以.lck结尾的文件夹删除或者保存为另外的文件名称,再打开虚拟机就OK了.
- UIButton的文本与图片的布局
UIButton内部文本和图片的布局是我们日常代码中,不可缺少的部分,按钮默认左边图片右边文本,那要实现左边文本,右边图片,我们该怎么解决呢,上面图片,下面文本又该怎么办呢 其实很简单,今天总结下,目 ...
- 办公大楼3D指纹门禁系统解决方案
随着人们对工作.生活的自动化水平也提出了越来越高的要求.以大楼安保对出入大楼的外来人员进行登记放行或以铁锁.钥匙和卡为代表的出入管理方式已无法满足需求. 利用科技的手段,实现办公大楼的安全现代化.管理 ...
- Mac系统下配置Tomcat
1.下载Tomcat,网址:http://tomcat.apache.org/download-70.cgi: 2.进入终端Terminal,打开配置文件.bash_profile,输入open .b ...
- get传中文参数乱码解决方法
通常我们前端不同页面之间传参数用得最多的方法就是get方法:在url后面加上参数.例如:www.test.com?id=1&name=hello. 英文和字母很好处理,但是如果有的参数值为中文 ...
- UITableView使用
@多组数据和多组cell 1根数组内含数组时,只可以开启一组cell,内含多个数组时,可以开启多组cell 2多个数组开启多个cell时,既可以竖向开启,也可以横向里层开启,就好比猜题的模式 @注意点 ...
- apache2.4以上版本配置虚拟主机
一 将 主配置文件 httpd.conf中 #Include conf/extra/httpd-vhosts.conf 前面的# 去掉 二 进入conf/extra 修改 /conf/extra/ ...
- Apache 403 error, (13)Permission denied: access to / denied问题
Apache 配置Alias 后,无法访问 CentOS系统 检查了一圈httpd.conf和目录权限,均没有发现问题. 最后,看了这篇文章,发现是因为系统启动了SELINUX导致的. http:// ...