P4381 [IOI2008]Island】的更多相关文章

P4381 [IOI2008]Island 题意:求图中所有基环树的直径和 我们对每棵基环树分别计算答案. 首先我们先bfs找环(dfs易爆栈) 蓝后我们处理直径 直径不在环上,就在环上某点的子树上 我们对于环上每个点的子树,跑一边dp求直径即可,顺带处理子树的最深深度(环上点到子树某个叶节点的最长距离)$dis[x]$ 在dfs求直径时顺带求直径的最大值(可能是整棵基环树的直径) 蓝后我们在环上跑一遍dp. 我们先破环成链(就是把长度为$n$的环转换成长$2n+1$的链) 偷个图 我们记链上前…
原题传送门 题意:求基环树森林的直径(所有基环树直径之和) 首先,我们要对环上所有点的子树求出它们的直径和最大深度.然后,我们只用考虑在环上至少经过一条边的路径.那么,这种路径在环上一定有起始点和终点.(假设路径是从起始点开始,按顺时针方向走达到终点) 不妨枚举这段路径在环上的终点.由于规定了这个点和方向,我们就可以拆环了.然后是一个经典的技巧,把环上元素复制一遍,就可以枚举全部拆环方案.设环上有l个结点.那么,我们枚举终点,就相当于在长度为2l的数组上不断滑动一个长度为l的区间 剩下的问题与基…
传送门 显然题目给的图构成一个基环树森林 对于每个基环树单独考虑,显然每个都走直径是最优的 考虑如何求出基环树的直径 把直径分为两种情况考虑,首先可以找出环 因为直径可能不在环边上,所以对每个环上节点的子树进行一遍 $dfs$,求出每个节点子树的直径 维护 $dis[x]$ 表示节点 $x$ 到叶子节点的最长路程,那么直径就是每个节点儿子的 $dis$ 中最大和次大的和 可以一遍循环动态维护最大和次大 直径也可能在环上 设环上两点 $x,y$ 的距离为 $d(x,y)$,那么就是求最大的 $di…
一.题目 Description 你将要游览一个有N个岛屿的公园.从每一个岛i出发,只建造一座桥.桥的长度以Li表示.公园内总共有N座桥.尽管每座桥由一个岛连到另一个岛,但每座桥均可以双向行走.同时,每一对这样的岛屿,都有一艘专用的往来两岛之间的渡船. 相对于乘船而言,你更喜欢步行.你希望所经过的桥的总长度尽可能的长,但受到以下的限制. • 可以自行挑选一个岛开始游览. • 任何一个岛都不能游览一次以上. • 无论任何时间你都可以由你现在所在的岛S去另一个你从未到过的岛D.由S到D可以有以下方法…
1791: [Ioi2008]Island 岛屿 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 1826  Solved: 405[Submit][Status][Discuss] Description 你将要游览一个有N个岛屿的公园.从每一个岛i出发,只建造一座桥.桥的长度以Li表示.公园内总共有N座桥.尽管每座桥由一个岛连到另一个岛,但每座桥均可以双向行走.同时,每一对这样的岛屿,都有一艘专用的往来两岛之间的渡船. 相对于乘船而言,你更喜欢…
题目链接:[IOI2008]Island 题目大意:求基环树直径(由于题目的意思其实是类似于每个点只有一个出度,所以在每个联通块中点数和边数应该是相同的,这就是一棵基环树,所以题目给出的图就是一个基环树森林,又由于乘船的操作,可以知道答案就是将所有的直径相加起来的和) 分析:类似于树的直径,我们可以类推出基环树的直径也是有以下两种情况 ​ 1.是某个外向树的直径 ​ 2.两个点处于两课不同的外向树中(中间横跨了一段环上的边) ​ 我们首先要把环找到 ​ 对于1的处理,我们可以对环上的点及其外向树…
http://www.lydsy.com/JudgeOnline/problem.php?id=1791 就是求所有基环树的直径之和 加手工栈 #include<cstdio> #include<vector> #include<iostream> #include<algorithm> using namespace std; #define N 1000001 typedef long long LL; ,front[N],to[N<<],n…
BZOJ1791: [Ioi2008]Island 岛屿 Description 你将要游览一个有N个岛屿的公园. 从每一个岛i出发,只建造一座桥. 桥的长度以Li表示. 公园内总共有N座桥. 尽管每座桥由一个岛连到另一个岛,但每座桥均可以双向行走. 同时,每一对这样的岛屿,都有一艘专用的往来两岛之间的渡船. 相对于乘船而言,你更喜欢步行. 你希望所经过的桥的总长度尽可能的长,但受到以下的限制. • 可以自行挑选一个岛开始游览. • 任何一个岛都不能游览一次以上. • 无论任何时间你都可以由你现…
LuoguP4381 [IOI2008]Island Description 一句话题意:给一个基环树森林,求每棵基环树的直径长度的和(基环树的直径定义与树类似,即基环树上一条最长的简单路径),节点总数不超过\(10^6\). Solution 问题就是如何求基环树的直径. 首先树的直径的话可以直接\(dp\),那如果有一个环怎么办? 这个环上会挂着几棵树,那么直径只会有两种情况 不经过环上的边,即每棵树直径的最大值 经过一个环,即挂在换上的两棵树\(i,j\)的深度和在加上\(i,j\)在环上…
[bzoj1791][ioi2008]Island 岛屿(基环树.树的直径) bzoj luogu 题意可能会很绕 一句话:基环树的直径. 求直径: 对于环上每一个点记录其向它的子树最长路径为$dp_x$ 之后记录环上边长前缀和$ns_i$ dp值为$max_{i,j}dp[i]+sum[i]+dp[j]-sum[j]$ $dp[j]-sum[j]$提出来进单调队列. O(n). 记得dfs改bfs. #include<cstdio> #include<algorithm> usi…