【BZOJ 1791】 [Ioi2008]Island 岛屿
Description
Input
Output
Sample Input
3 8
7 2
4 2
1 4
1 9
3 4
2 3
Sample Output
HINT

#include<cstdio>
#include<iostream>
using namespace std;
const int N=;
struct ee{int to,next,w;}e[N*];
long long head[N],c[N],f[N],du[N],d[N],b[N*],a[N*],q[*N];
int n,timer,cnt;
long long ans;
bool vis[N];
void ins(int u,int v,int w){
e[++cnt].to=v;e[cnt].next=head[u];e[cnt].w=w;head[u]=cnt;du[u]++;
e[++cnt].to=u;e[cnt].next=head[v];e[cnt].w=w;head[v]=cnt;du[v]++;
} void dfs(int now,int k){
c[now]=k;
for (int i=head[now];i;i=e[i].next){
int v=e[i].to;
if(!c[v]) dfs(v,k);
}
} void topsort(){
int l=,r=;
for (int i=;i<=n;i++) if(du[i]==) q[++r]=i;
while(l<r) {
int now=q[++l];
for (int i=head[now];i;i=e[i].next){
int v=e[i].to;
if(du[v]>){
du[v]--;
d[c[now]]=max(d[c[now]],f[now]+f[v]+e[i].w);
f[v]=max(f[v],f[now]+e[i].w);
if(du[v]==)q[++r]=v;
}
}
}
} void dp(int t,int x){
int m=,y=x,i;
do{
a[++m]=f[y];du[y]=;
for(i=head[y];i;i=e[i].next){
int v=e[i].to;
if(du[v]>){
b[m+]=b[m]+e[i].w;
y=e[i].to;
break;
}
}
}while(i);
if(m==){//
int l=;
for (int i=head[y];i;i=e[i].next)
if(e[i].to==x) l=max(l,e[i].w);
d[t]=max(d[t],f[x]+f[y]+l);
return;
}
for(int i=head[y];i;i=e[i].next){
int v=e[i].to;
if(v==x) {
b[m+]=b[m]+e[i].w;
break;
}
}
for (int i=;i<=m;i++){
a[i+m]=a[i];
b[m+i]=b[m+]+b[i];
}
int l,r;
q[l=r=]=;
for (int i=;i<*m;i++){
while(l<=r&&i-q[l]>=m)l++;
d[t]=max(b[i]-b[q[l]]+a[i]+a[q[l]],d[t]);
while(l<=r&&a[q[r]]+b[i]-b[q[r]]<=a[i]) r--;
q[++r]=i;
} } int main(){
scanf("%d",&n);
int v,w;
for (int i=;i<=n;i++){
scanf("%d%d",&v,&w);
ins(i,v,w);
}
for (int i=;i<=n;i++) if (!c[i]) dfs(i,++timer);
topsort();
for (int i=;i<=n;i++){
if(du[i]>&&!vis[c[i]]) {
vis[c[i]]=;
dp(c[i],i);
ans+=d[c[i]];
}
}
cout<<ans<<endl;
}
【BZOJ 1791】 [Ioi2008]Island 岛屿的更多相关文章
- bzoj 1791: [Ioi2008]Island 岛屿
#include<iostream> #include<cstdio> #define M 1000009 using namespace std; *M],cnt,n,hea ...
- BZOJ 1791: [IOI2008]Island 岛屿 - 基环树
传送门 题解 题意 = 找出无向基环树森林的每颗基环树的直径. 我们首先需要找到每颗基环树的环, 但是因为是无向图,用tarjan找环, 加个手工栈, 我也是看了dalao的博客才知道tarjan找无 ...
- bzoj 1791: [Ioi2008]Island 岛屿【基环树+单调队列优化dp】
我太菜了居然调了一上午-- 这个题就是要求基环树森林的基环树直径和 大概步骤就是找环->dp找每个环点最远能到达距离作为点权->复制一倍环,单调队列dp 找环是可以拓扑的,但是利用性质有更 ...
- bzoj千题计划114:bzoj1791: [Ioi2008]Island 岛屿
http://www.lydsy.com/JudgeOnline/problem.php?id=1791 就是求所有基环树的直径之和 加手工栈 #include<cstdio> #incl ...
- bzoj1791: [Ioi2008]Island 岛屿 单调队列优化dp
1791: [Ioi2008]Island 岛屿 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 1826 Solved: 405[Submit][S ...
- [bzoj1791][ioi2008]Island 岛屿(基环树、树的直径)
[bzoj1791][ioi2008]Island 岛屿(基环树.树的直径) bzoj luogu 题意可能会很绕 一句话:基环树的直径. 求直径: 对于环上每一个点记录其向它的子树最长路径为$dp_ ...
- BZOJ1791: [Ioi2008]Island 岛屿
BZOJ1791: [Ioi2008]Island 岛屿 Description 你将要游览一个有N个岛屿的公园. 从每一个岛i出发,只建造一座桥. 桥的长度以Li表示. 公园内总共有N座桥. 尽管每 ...
- bzoj1791[IOI2008]Island岛屿(基环树+DP)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1791 题目大意:给你一棵n条边的基环树森林,要你求出所有基环树/树的直径之和.n< ...
- BZOJ1791[Ioi2008]Island 岛屿 ——基环森林直径和+单调队列优化DP+树形DP
题目描述 你将要游览一个有N个岛屿的公园.从每一个岛i出发,只建造一座桥.桥的长度以Li表示.公园内总共有N座桥.尽管每座桥由一个岛连到另一个岛,但每座桥均可以双向行走.同时,每一对这样的岛屿,都有一 ...
随机推荐
- javaweb学习总结七(XML语言作用、语法)
一:XML语言的概念以及作用 1:xml概念:extensible Markup language,可扩展行标记语言,因为html的语法比较混乱,不够严谨. 用html写的系统不好维护,所以w3c组织 ...
- 关于js判断鼠标移入元素的方向——上下左右
一开始我是这么想的,将待移入的元素分割四块,用mousemove获取第一次鼠标落入的区域来判断鼠标是从哪个方向进去的. 所以只要写个算法来判断鼠标的值落入该元素的区域就可以得出鼠标移入的方向,如下图: ...
- 24小时学通Linux内核--内核探索工具类
寒假闲下来了,可以尽情的做自己喜欢的事情,专心待在实验室里燥起来了,因为大二的时候接触过Linux,只是关于内核方面确实是不好懂,所以十天的时间里还是希望能够补充一下Linux内核相关知识,接下来继续 ...
- Netbackup备份失败:ORA-19506 ORA-27028 ORA-19511
Netbackup之前备份RAC数据一直都非常正常,突然这几天出现异常: channel ch00: starting piece 1 at 2013-11-24:18:02:32released c ...
- python方式实现scoket通信
要想明白这个网络通信还真的是离不开实现它实现流程图,看明白了大体很多都知道,觉得这个博主画的不错,地址是 http://www.cnblogs.com/wangcq/p/3520400.html 1. ...
- ACM进阶
ACM队不是为了一场比赛而存在的,为的是队员的整体提高. 大学期间,ACM队队员必须要学好的课程有: l C/C++两种语言 l 高等数学 l 线性代数 l 数据结构 l 离散数学 l 数据库原理 l ...
- Spring(3.2.3) - Beans(2): 属性注入 & 构造注入
依赖注入是指程序运行过程中们如果需要另外的对象协作(访问它的属性或调用它的方法)时,无须在代码中创建被调用者,而是依赖于外部容器的注入. 属性注入(Setter Injection) 属性注入是指 I ...
- Sqlite事物与锁
1事务 事务定义了一组SQL命令的边界,这组命令或者作为一个整体被全部执行,或者都不执行.事务的典型实例是转帐. 2事务的范围 事务由3个命令控制:BEGIN.COMMIT和ROLLBACK.BEGI ...
- 解决TextView在显示文字的时候,一行还没显示满就跳到下一行
转载请注明:转自 http://blog.csdn.NET/u011176685/article/details/48295185 一.问题描述: Android的TextView在显示文字的时候,如 ...
- Windows下TEX排版论文攻略—CTeX、JabRef使用心得
笔者刚刚接触到TEX排版,相关知识完全空白,用了两天时间学习并完成了一篇论文的完整排版. 期间遇到不少小问题,着实辛苦,分享至上,现将其解决办法总结归纳,共同学习. 一.工具介绍 TeX是一个 ...