POJ 3567 Cactus Reloaded(仙人掌直径)
题意
裸的仙人掌直径。
题解
先考虑基环树的直径:先算出每颗“树”的直径,再在环上跑DP
再考虑仙人掌的直径:把每个基环树缩成一条边,边长为基环树深度。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int N=;
const int M=;
int cnt,head[N];
int c[N*],dp[N],q[N*],ans;
int dfn[N],low[N],tot,fa[N];
int n,m;
struct edge{
int to,nxt;
}e[M*];
void add(int u,int v){
cnt++;
e[cnt].nxt=head[u];
e[cnt].to=v;
head[u]=cnt;
}
void getdp(int x,int y){
int l,r,i,m,p;
for(m=;y!=x;y=fa[y])c[++m]=dp[y];
for(c[++m]=dp[x],i=;i<m;i++)c[i+m]=c[i];
l=r=q[]=;p=m/;
for(i=;i<=m+p;i++){
while(l<=r&&i-q[l]>p)l++;
ans=max(ans,c[i]+c[q[l]]+i-q[l]);
while(l<=r&&c[i]>=c[q[r]]+i-q[r])r--;
q[++r]=i;
}
for(int i=;i<m;i++)dp[x]=max(dp[x],c[i]+min(i,m-i));
}
void Tarjan(int u){
dfn[u]=low[u]=++tot;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(fa[u]==v)continue;
if(dfn[v]==){
fa[v]=u;
Tarjan(v);
low[u]=min(low[v],low[u]);
if(dfn[u]<low[v]){
ans=max(ans,dp[v]+dp[u]+);
dp[u]=max(dp[u],dp[v]+);
}
}else low[u]=min(low[u],dfn[v]);
}
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(fa[v]!=u&&dfn[u]<dfn[v])getdp(u,v);
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=,a,x;i<=m;i++){
scanf("%d%d",&a,&x);
for(int j=,y;j<a;j++){
scanf("%d",&y);
add(x,y);
add(y,x);
x=y;
}
}
Tarjan();
printf("%d",ans);
return ;
}
POJ 3567 Cactus Reloaded(仙人掌直径)的更多相关文章
- bzoj 1023 [SHOI2008]cactus仙人掌图 ( poj 3567 Cactus Reloaded )——仙人掌直径模板
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1023 http://poj.org/problem?id=3567 因为lyd在讲课,所以有 ...
- bzoj1023 [SHOI2008]cactus仙人掌图 & poj3567 Cactus Reloaded——求仙人掌直径
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1023 http://poj.org/problem?id=3567 仙人掌!直接模仿 ...
- POJ 1985 Cow Marathon && POJ 1849 Two(树的直径)
树的直径:树上的最长简单路径. 求解的方法是bfs或者dfs.先找任意一点,bfs或者dfs找出离他最远的那个点,那么这个点一定是该树直径的一个端点,记录下该端点,继续bfs或者dfs出来离他最远的一 ...
- POJ 3384 Feng Shui 凸包直径 + 半平面交
G++一直没有过了 换成 C++果断A掉了...It's time to bet RP. 题意:给一个多边形,然后放进去两个圆,让两个圆的覆盖面积尽量最大,输出两个圆心的坐标. 思路:将多边形的边向里 ...
- HDU 3594 Cactus (强连通+仙人掌图)
<题目链接> <转载于 >>> > 题目大意: 给你一个图,让你判断他是不是仙人掌图. 仙人掌图的条件是: 1.是强连通图. 2.每条边在仙人掌图中只属于一个 ...
- HDU 3594 Cactus(仙人掌问题)
http://acm.hdu.edu.cn/showproblem.php?pid=3594 题意: 一个有向图,判断是否强连通和每条边只在一个环中. 思路: 仙人掌问题. 用Tarjan算法判断强连 ...
- POJ 1985.Cow Marathon-树的直径-树的直径模板(BFS、DFS(vector存图)、DFS(前向星存图))
Cow Marathon Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 7536 Accepted: 3559 Case ...
- [NEERC2007][SHOI2008]Cactus Reloaded
题目大意: 给你一个仙人掌,求图中相距最远的点对之间的距离. 思路: Tarjan+DP. 我们先考虑一个树的情况. 设用far[u]表示点u出发到其子树中叶子节点的最大距离,若v为u的子结点,很显然 ...
- POJ 1985 求树的直径 两边搜OR DP
Cow Marathon Description After hearing about the epidemic of obesity in the USA, Farmer John wants h ...
随机推荐
- 从零开始编写一个vue插件
title: 从零开始编写一个vue插件 toc: true date: 2018-12-17 10:54:29 categories: Web tags: vue mathjax 写毕设的时候需要一 ...
- jQuery学习(五)——使用JQ完成复选框的全选和全不选
1.在系统后台进行人员管理时,进行批量删除,使用jq完成全选和全不选 步骤分析: 第一步:引入jquery文件 第二步:书写页面加载函数 第三步:为上面的复选框绑定单击事件 第四步:将下面所有的复选框 ...
- 根据SPID查找SQL语句
SELECT /*+ ORDERED */ sql_text FROM v$sqltext a WHERE (a.hash_value, a.address) ...
- Dropout 上
From <白话深度学习与TensorFlow> Dropout 顾名思义是“丢弃”,在一轮训练阶段丢弃一部分网络节点,比如可以在其中的某些层上临时关闭一些节点,让他们既不输入也不输出,这 ...
- 洛谷P3355 骑士共存问题 二分图_网络流
Code: #include<cstdio> #include<cstring> #include<queue> #include<vector> #i ...
- [NOI2015]品酒大会(后缀树+DP)
后缀自动机有一个性质. 就是如果倒建SAM两个串的lcp就是这两个串的结束节点的LCA. 然后就可以愉快的跑DP了. 对于每一个后缀树上的节点\(u\),它对\(len[u]\)的贡献是\(\sum_ ...
- redis搭建与安装2
第一步redis安装:1.首先确认下载包为64位的还是32位的2.下载http://code.google.com/p/servicestack/downloads3.解压下载包得到以下文件:cygw ...
- ProGuard常见问题及解决套路
ProGuard是一个压缩.优化和混淆Java字节码的工具,非常好用.本篇文章总结一下许多人在使用ProGuard时经常遇到的问题. 我把在使用ProGuard时经常遇到的问题分为两类,分别是导致构建 ...
- Vue组件使用基础
这篇博文用来记录 .vue 组件的使用方法. 可以把组件代码按照 template.style.script 的拆分方式,放置到对应的 .vue 文件中. 模板(template).初始数据(data ...
- CSS透明度设置支持IE,Chrome,Firefox浏览器
CSS文件里设置例如以下就可以 filter:alpha(opacity=60); //支持IE opacity:0.6; //支持Chrome.Firefox