题目描述:

bz

luogu

题解:

裸的基环树直径。

代码:

#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = ;
template<typename T>
inline void read(T&x)
{
T f = ,c = ;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){c=c*+ch-'';ch=getchar();}
x = f*c;
}
int n,hed[N],cnt=;
ll ans;
struct EG
{
int to,nxt;
ll w;
}e[*N];
void ae(int f,int t,ll w)
{
e[++cnt].to = t;
e[cnt].nxt = hed[f];
e[cnt].w = w;
hed[f] = cnt;
}
int sta[*N],tl,rt;
ll ste[N];
bool vis[N],cir[N],use[N];
int dfs0(int u,int pre)
{
if(vis[u])
{
rt = u;
return ;
}
vis[u] = ;
for(int j=hed[u],now;j;j=e[j].nxt)
{
int to = e[j].to;
if(j==pre)continue;
if((now=dfs0(to,j^)))
{
if(now==)
{
sta[++tl] = u;
ste[tl] = e[j].w;
cir[u] = ;
if(u!=rt)return ;
}
return ;
}
}
return ;
}
int fa[N];
ll dp[N],sum[*N],st[*N],h,l,now;
void bfs(int u)
{
h = ,l = ;
st[++l] = u;
use[u]=;
while(h<=l)
{
u = st[h++];
for(int j=hed[u];j;j=e[j].nxt)
{
int to = e[j].to;
if(use[to]||cir[to])continue;
use[to] = ;
fa[to] = u;
st[++l] = to;
}
}
for(int i=l;i>=;i--)
{
u = st[i];
for(int j=hed[u];j;j=e[j].nxt)
{
int to = e[j].to;
if(cir[to]||to==fa[u])continue;
ll tmp = dp[to]+e[j].w;
now = max(now,dp[u]+tmp);
dp[u]=max(dp[u],tmp);
}
}
}
int main()
{
// freopen("tt.in","r",stdin);
read(n);
for(int f,w,i=;i<=n;i++)
{
read(f),read(w);
ae(f,i,w),ae(i,f,w);
}
for(int i=;i<=n;i++)if(!use[i])
{
tl=;now=;
dfs0(i,);
for(int j=;j<=tl;j++)
bfs(sta[j]),sta[j+tl]=sta[j];
if(tl==)
{
now = max(now,dp[sta[]]+ste[]);
ans+=now;
continue;
}
for(int j=;j<=tl;j++)sum[j]=sum[j-]+ste[j];
for(int j=;j<=tl;j++)sum[j+tl]=sum[j+tl-]+ste[j];
h = ,l = ;
for(int j=;j<=*tl;j++)
{
while(h<l&&st[h]+tl<=j)h++;
if(h<=l)now = max(now,dp[sta[j]]+sum[j]+dp[sta[st[h]]]-sum[st[h]]);
while(h<l&&dp[sta[st[l]]]-sum[st[l]]<dp[sta[j]]-sum[j])l--;
st[++l] = j;
}
ans+=now;
}
printf("%lld\n",ans);
return ;
}

IOI2008 Island 岛屿的更多相关文章

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

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

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

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

  3. BZOJ1791: [Ioi2008]Island 岛屿

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

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

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

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

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

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

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

  7. bzoj 1791: [Ioi2008]Island 岛屿

    #include<iostream> #include<cstdio> #define M 1000009 using namespace std; *M],cnt,n,hea ...

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

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

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

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

  10. [BZOJ1791][IOI2008]Island岛屿(环套树DP)

    同NOI2013快餐店(NOI出原题?),下面代码由于BZOJ栈空间过小会RE. 大致是对每个连通块找到环,在所有内向树做一遍DP,再在环上做两遍前缀和优化的DP. #include<cstdi ...

随机推荐

  1. Swift异常处理的try?与try!

    首先要明白抛出异常后异常的运动:异常被抛出后,中断整个处理,异常不断向外层(范围)传递,直到遇到catch代码块群,会与catch代码块的条件进行匹配,匹配符合则进入此代码块处理.如果遇到没有条件的c ...

  2. 洛谷 - P1801 - 黑匣子 - 对顶堆

    这道题是提高+省选-的难度,做出来的话对数据结构题目的理解会增加很多. 可以使用一种叫做对顶堆的东西,对顶堆是在线维护第n小的logn的算法.大概的思路是,假如我们要找的是第n小,我们就维护一个大小为 ...

  3. vector理解一波~~~

    Vector: 头文件: #include<vector> using namespacestd; 定义: vector<类型>q;//类同于  "类型 q[];&q ...

  4. 老天待我不薄,又来这么一题POJ1753

    还是位运算+BFS系列题: 现在这种真是无比喜欢,今天搞了一上午这题...因为状态的改变写错了-T.T #include<cstdio> #include<queue> #in ...

  5. jetty的web部署

    jetty版本:jetty-distribution-9.4.8.v20171121,jdk1.8 1.下载jetty 2.cd demo-base 3.java -jar ../start.jar ...

  6. bzoj 3796: Mushroom追妹纸【二分+后缀数组+st表】

    把三个串加上ASCII大于z的分隔符连起来,然后求SA 显然每个相同子串都是一个后缀的前缀,所以枚举s1的每个后缀的最长和s2相同的前缀串(直接在排序后的数组里挨个找,最近的两个分别属于s1和s2的后 ...

  7. Springboot 配置 application.yml 连接MySQL数据库

    1.在pom.xml的<dependencies></dependencies>标签中中加入以下依赖 <dependency> <groupId>org ...

  8. .net mvc中一种简单的工作流的设计

    开篇前的废话:工作流是我们在做互联网应用开发时经常需要用到的一种技术,复杂的工作流我们基本是借助一些开源的 工作流项目来做,比如 ccflow等,但是有时候,我们只需要实现一些简单的工作流流程,这时候 ...

  9. python之self本类对象

    不知道写点啥好,讲的都太绕了 似懂非懂,貌似懂了 以后再补充吧,视频day8_3中的20——60分钟那一部分

  10. Four Segments CodeForces - 846C

    题目 题意:sum(l,r)表示数列a中索引为l到r-1(都包含)的数之和(如果l==r则为0).给出数列a,求合适的delim0, delim1, delim2,使res = sum(0, deli ...