【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座桥.尽管每座桥由一个岛连到另一个岛,但每座桥均可以双向行走.同时,每一对这样的岛屿,都有一 ...
随机推荐
- javaweb学习总结十(xml解析<SAX以及DOM方式>)
一:XML解析技术 一般我们使用sun公司或者开源组织开发的工具包解析xml效率比较高. 1:jaxp解析xml,jaxp是sun公司开发的解析xml工具包 2:jaxp解析xml代码如下 a:获取d ...
- Windows环境下安装导入tornado
首先,一台安装并配置好了python,我的python版本的肯定是2.7,直接进入tornado的环节: 下载tornado的压缩包,我的下载地址为:https://codeload.github.c ...
- [改善Java代码]频繁插入和删除时使用LinkedList
一.分析 前面有文章分析了列表的表里方式,也就是“读”的操作.本文将介绍表的“写”操作:即插入.删除.修改动作. 二.场景 1.插入元素 列表中我们使用最多的是ArrayList,下面看看他的插入(a ...
- java开发:分享一下MemCached的使用
在项目开发中,有些不经常修改的数据,我们通常都会选择使用缓存.其中一种方式,就是memcached. windows系统中,我们需要下载并安装memcached. 地址如:D:\memcached\m ...
- HDOJ2009求数列的和
求数列的和 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- Android Studio工程目录介绍
来自知乎: Android Studio工程目录结构 .gradle 是gradle运行以后生成的缓存文件夹. .idea 是android studio/Intellij IDEA工程打开以后生成的 ...
- python学习day1--python基础
Python的优缺点 先看优点 Python的定位是“优雅”.“明确”.“简单”,所以Python程序看上去总是简单易懂,初学者学Python,不但入门容易,而且将来深入下去,可以编写那些非常非常复杂 ...
- android不依赖具体activity弹出Dialog对话框,即全局性对话框
最近在DialogUtil类中声明了一个静态的弹出Dialog方法,弹出的Dialog也是静态的,并且只在第一次进行创建,由于Dialog弹出依附于Activity,所以就出现了问题. 即:第一次调用 ...
- Cocoa框架中的内存分区
NSObject对象类实例为我们提供了两种分配内存的方式:alloc和allocWithZone:.alloc的实现也是为了调用allocWitZone:,它传入了一个默认的zone.所以明确的说,N ...
- IOS中的内存不足警告处理(译)
由于在IOS中虚拟内存系统不会采用页置换的方式来获取请求内存,取而代之的是它通过移除应用程序中的强引用来释放一些内存资源,我们知道强引用在IOS中表示拥有关系,只要有至少一个变量拥有这个对象,那么对象 ...