题目描述:

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. bzoj 3513: [MUTC2013]idiots【生成函数+FFT】

    想了好长时间最后发现真是石乐志 第一反应就是两边之和大于第三边,但是这个东西必须要满足三次-- 任意的两边之和合通过生成函数套路+FFT求出来(记得去掉重复选取的),然后这任意两边之和大于任意第三边可 ...

  2. git apply

    1. git 安装   2.git 与服务器的验证   1.生成ssh ssh-keygen -t rsa -C "1107247128@qq.com" 2.查看生成的pub文件, ...

  3. (九)SpringBoot整合redis框架

    二:添加Redis依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactI ...

  4. svn项目添加到tomcat后,tomcat无法打开问题解决

    1,tomcat版本更改 由7.0.81更改至8.0.47(8.5.23在添加至eclipse后版本不符无法使用) 更改版本后记得修改Server Locations-->双击服务器--> ...

  5. 514 Freedom Trail 自由之路

    详见:https://leetcode.com/problems/freedom-trail/description/ C++: class Solution { public: int findRo ...

  6. spring Existing transaction found for transaction marked with propagation 'never' 解决

    先在申明事务中配置了所有的事务 <!--配置事物传播策略,以及隔离级别--> <tx:advice id="txAdvice" transaction-manag ...

  7. 从源码中无法看出函数所在的js脚本的解决方法

    通过设置断点调试使js脚本自动出现

  8. Debian9镜像安装问题

    Debian9下载地址 https://www.debian.org/distrib/ Debian9有三个镜像文件 第一个包含系统2.3两个主要是一些软件的安装包只需下载第一个安装系统即可 默认安装 ...

  9. Codeforces GYM 100741A . Queries

    time limit per test 0.25 seconds memory limit per test 64 megabytes input standard input output stan ...

  10. 工作笔记:复制文件--从windows到ubuntu,再到fedora

    最近在测试跨平台类库,于是写了一些小程序. 当然主要利用vs进行主要的代码开发.eclipse进行linux的调试. 那么需要不时同步项目文件. 考虑到项目简单,所以没有使用svn. 1. 从wind ...