#include<iostream>
#include<cstdio>
#define M 1000009
using namespace std;
int q[*M],cnt,n,head[M],next[*M],u[*M],l[*M],du[M],c[M],t,v[M];
long long f[M],d[M],d1[*M],a[*M],ans;
void jia(int a1,int a2,int a3)
{
cnt++;
next[cnt]=head[a1];
head[a1]=cnt;
u[cnt]=a2;
l[cnt]=a3;
du[a1]++;
return;
}
void dfs(int k,int x)
{
c[x]=k;
for(int i=head[x];i;i=next[i])
if(!c[u[i]])
dfs(k,u[i]);
return;
}
void tuopu()
{
int h=,t=;
for(int i=;i<=n;i++)
if(du[i]==)
{
t++;
q[t]=i;
}
for(;h<t;)
{
h++;
int p=q[h];
for(int i=head[p];i;i=next[i])
if(du[u[i]]!=)
{
du[u[i]]--;
d[c[p]]=max(d[c[p]],f[p]+f[u[i]]+l[i]);
f[u[i]]=max(f[u[i]],f[p]+l[i]);
if(du[u[i]]==)
{
t++;
q[t]=u[i];
}
}
}
}
void dp(int t1,int x)
{
int m=,y=x,i;
do
{
a[++m]=f[y];
du[y]=;
for(i=head[y];i;i=next[i])
if(du[u[i]]>)
{
d1[m+]=d1[m]+l[i];
y=u[i];
break;
}
}while(i);
if(m==)
{
int qq=;
for(int i=head[y];i;i=next[i])
if(u[i]==x)
qq=max(qq,l[i]);
d[c[x]]=max(d[c[x]],a[]+a[]+qq);
return;
}
for(int i=head[y];i;i=next[i])
if(u[i]==x)
{
d1[m+]=d1[m]+l[i];
break;
}
for(int i=;i<=m;i++)
{
a[m+i]=a[i];
d1[m+i]=d1[m+]+d1[i];
}
int h=t=;
q[]=;
for(int i=;i<=*m;i++)
{
for(;h<=t&&i-q[h]>=m;h++);
d[t1]=max(d[t1],a[q[h]]+a[i]+d1[i]-d1[q[h]]);
for(;h<=t&&a[q[t]]-d1[q[t]]<=a[i]-d1[i];t--);
t++;
q[t]=i;
}
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
int a1,a2;
scanf("%d%d",&a1,&a2);
jia(i,a1,a2);
jia(a1,i,a2);
}
for(int i=;i<=n;i++)
if(!c[i])
{
t++;
dfs(t,i);
}
tuopu();
for(int i=;i<=n;i++)
if(du[i]>&&!v[c[i]])
{
v[c[i]]=;
dp(c[i],i);
ans+=d[c[i]];
}
printf("%lld\n",ans);
return ;
}

这个题建出图来之后,是一个基环树森林,先把非环部分的最长链用DP求出来,在把环拆开,变为两倍,找环上两点之间的距离加上在这两个点的子树中,以这两个点为端点的最长链的

长度,注意如果是两个点的环,需要特判,因为不一定能找到那条最长的边。

bzoj 1791: [Ioi2008]Island 岛屿的更多相关文章

  1. BZOJ 1791: [IOI2008]Island 岛屿 - 基环树

    传送门 题解 题意 = 找出无向基环树森林的每颗基环树的直径. 我们首先需要找到每颗基环树的环, 但是因为是无向图,用tarjan找环, 加个手工栈, 我也是看了dalao的博客才知道tarjan找无 ...

  2. bzoj 1791: [Ioi2008]Island 岛屿【基环树+单调队列优化dp】

    我太菜了居然调了一上午-- 这个题就是要求基环树森林的基环树直径和 大概步骤就是找环->dp找每个环点最远能到达距离作为点权->复制一倍环,单调队列dp 找环是可以拓扑的,但是利用性质有更 ...

  3. bzoj千题计划114:bzoj1791: [Ioi2008]Island 岛屿

    http://www.lydsy.com/JudgeOnline/problem.php?id=1791 就是求所有基环树的直径之和 加手工栈 #include<cstdio> #incl ...

  4. bzoj1791: [Ioi2008]Island 岛屿 单调队列优化dp

    1791: [Ioi2008]Island 岛屿 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 1826  Solved: 405[Submit][S ...

  5. [bzoj1791][ioi2008]Island 岛屿(基环树、树的直径)

    [bzoj1791][ioi2008]Island 岛屿(基环树.树的直径) bzoj luogu 题意可能会很绕 一句话:基环树的直径. 求直径: 对于环上每一个点记录其向它的子树最长路径为$dp_ ...

  6. BZOJ1791: [Ioi2008]Island 岛屿

    BZOJ1791: [Ioi2008]Island 岛屿 Description 你将要游览一个有N个岛屿的公园. 从每一个岛i出发,只建造一座桥. 桥的长度以Li表示. 公园内总共有N座桥. 尽管每 ...

  7. 【BZOJ 1791】 [Ioi2008]Island 岛屿

    Description 你将要游览一个有N个岛屿的公园.从每一个岛i出发,只建造一座桥.桥的长度以Li表示.公园内总共有N座桥.尽管每座桥由一个岛连到另一个岛,但每座桥均可以双向行走.同时,每一对这样 ...

  8. bzoj1791[IOI2008]Island岛屿(基环树+DP)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1791 题目大意:给你一棵n条边的基环树森林,要你求出所有基环树/树的直径之和.n< ...

  9. BZOJ1791[Ioi2008]Island 岛屿 ——基环森林直径和+单调队列优化DP+树形DP

    题目描述 你将要游览一个有N个岛屿的公园.从每一个岛i出发,只建造一座桥.桥的长度以Li表示.公园内总共有N座桥.尽管每座桥由一个岛连到另一个岛,但每座桥均可以双向行走.同时,每一对这样的岛屿,都有一 ...

随机推荐

  1. [转载] Linux下高并发socket最大连接数所受的各种限制

    原文: http://mp.weixin.qq.com/s?__biz=MzAwNjMxNjQzNA==&mid=207772333&idx=1&sn=cfc8aadb422f ...

  2. oracle的正则表达式

    阅读目录 1.oracle(regular expression)简单介绍 2.oracle正则特殊字符 3.oracle正则字符簇 4.各种操作符的运算优先级 5.模拟测试例子 6.oracle对应 ...

  3. Java可变参数 & Python可变参数 & Scala可变参数

    Java 可变参数的特点: (1).只能出现在参数列表的最后: (2)....位于变量类型和变量名之间,前后有无空格都可以: (3).调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体 ...

  4. swift语言学习之UITableView分割线左边到头的解决

    此方法兼容ios 7.8.9  // 在tableView创建地方设置 if tableView!.respondsToSelector("setSeparatorInset:") ...

  5. Jni的一个异常

    UnsatisfiedLinkError:No implementation found for java.lang.String com.skymaster.hs.test4.MainActivit ...

  6. 关于ipxe启动的几个疑问

    关于ipxe启动的几个疑问 http://bbs.wuyou.net/forum.php?mod=viewthread&tid=373026&page=1&extra=#pid ...

  7. ios开发者证书 签发者无效

    2月14日以后,由于苹果更新安全证书:会导致本机制作的所有开发者证书无效: 钥匙串里的开发者证书无法使用 解决方式: 重新下载苹果公司的安全证书,并安装 1: 先在钥匙串里搜索到老的证书,如果有,请先 ...

  8. java 抽象类

    抽象类: 1)函数没有方法体,就必须用abstract修饰. 2)抽象函数所在的类必须也是抽象的. 3)非抽象的类继承于抽象类,必须实现其全部方法. 4)抽象类中可以存在抽象方法,也可以不存在. 5) ...

  9. Computer assembly and maintenance

    转载请注明出处: 我所遇见的世界会更美好 第一章 计算机的基本构成和组装 1,内存的组成? (1)  RAM(随机存取存储器) (2)  ROM(只读存储器) (3)  Cache(高速缓存) 2,S ...

  10. 3D动画

    先上一道菜 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...