【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座桥.尽管每座桥由一个岛连到另一个岛,但每座桥均可以双向行走.同时,每一对这样的岛屿,都有一 ...
随机推荐
- 使用git ftp发布我个人的hexo博客内容
自己虚拟主机中的博客是由hexo3 + next主题,因为我想将 hexo 编译生成的文件可以通过ftp命令发布到ftp服务器上面. 发布使用的工具是git-ftp: 按照Use Jenkins an ...
- php 常用的好函数(持续更新)
parse_url parse_url $url = "http://www.electrictoolbox.com/php-extract-domain-from-full-url/&qu ...
- HTML特殊符号对照表(转)
table { border-collapse: collapse; } #htmlchar-container-list { width: 100%; border-top: 2px solid # ...
- ASP判断当前页面上是否有参数ID传递过来
遇到了一个这样的ASP问题: 在当前页面上判断,是否有参数ID传递过来? 如果没有,显示“没有参数传递过来”. 如果有传递,但值为空,显示“存在参数,但参数为空” <% if (request( ...
- PHP 和Apache的安装和配置
1. apache官网安装指南: http://jingyan.baidu.com/article/29697b912f6539ab20de3cf8.html 2. 官方安装包下载地址: http:/ ...
- JavaScript--面向对象与原型(15)
// ECMAScript有两种开发模式:1.函数式(过程化);2.面向对象(OOP); 一 创建对象 1.普通的创建对象 1 // 创建一个对象,然后给这个对象新的属性和方法; 2 var box ...
- JavaScript DOM编程艺术第一章:JavaScript简史
本系列的博客是由本人在阅读<JavaScript DOM编程艺术>一书过程中做的总结.前面的偏理论部分都是书中原话,觉得有必要记录下来,方便自己翻阅,也希望能为读到本博客的人提供一些帮助, ...
- 当里个当,免费的HTML5连载来了《HTML5网页开发实例详解》连载(一)
读懂<HTML5网页开发实例详解>这本书 你还在用Flash嘛?帮主早不用了 乔布斯生前在公开信“Flash之我见”中预言:像HTML 5这样在移动时代中创立的新标准,将会在移动设备上获得 ...
- 线程模式HS/HA和L/F的区别, HS/HA的实现原理图
线程池模式一般分为两种:L/F领导者与跟随者模式.HS/HA半同步/半异步模式. HS/HA 半同步/ 半异步模式 :分为三层,同步层.队列层.异步层,又称为生产者消费者模式,主线程处理I/O事件并解 ...
- L002-oldboy-mysql-dba-lesson02
L002-oldboy-mysql-dba-lesson02 [root@web01 ~]# mysql -uroot -ptestpassword mysql> use mys ...