圆方树&广义圆方树[学习笔记]
仙人掌
圆方树是用来解决仙人掌图的问题的,那什么是仙人掌图呢?
如图,不存在边同时属于多个环的无向连通图是一棵仙人掌
圆方树
定义
原先的仙人掌图,通过一些奇妙的方法,可以转化为一棵由圆点,方点和树边构成的树——圆方树,具体构建方法如下
原仙人掌的每一个点为圆点,对于每个环都新建一个方点,方点向环上的每一个圆点连边,就构成了圆方树。
构建方法
用\(tarjan\)算法求出点双,对于每一个点双新建一个方点与环上的点相连,注意一条边连接两个点的不算点双。
代码:
void tarjan(int x,int f){
dfn[x]=low[x]=++tim;
st[++tot]=x;
for(int i=G.head[x];i;i=G.nex[i])
if(G.v[i]!=f){
int y=G.v[i];
if(!dfn[y]){
tarjan(y,x);
low[x]=min(low[x],low[y]);
if(low[y]==dfn[x]){
siz++;
while(st[tot]!=y)
T.add(n+siz,st[tot--]);
T.add(n+siz,st[tot--]);
T.add(n+siz,x);
}
}
else
if(y!=f)
low[x]=min(low[x],dfn[y]);
}
}
在别人的博客里学到了一种更妙的构造方法:
记\(ring[i]\)表示点i是否在一个环里。对于某个点x,我们要从它遍历到它的子节点y时,先将\(ring[x]\)赋为0;然后,我们在\(tarjan\)的时候,若有某个点x,对于其一条连向点y的出边,满足\(dfn[y]<dfn[x]\),则表明y为其祖先,我们就找到了一个环,于是建方点、连新边,并使该环中每个节点的\(ring\)变为1;于是,回溯回那个点\(x\),若\(ring\)依然\(=0\),则表明那个y没有与之形成环,故边\((x,y)\)是树边,在\(T\)中连上它。
以及构造的代码:
void tarjan(int x){
dfn[x]=++tim;
for(int i=G.head[x];i;i=G.nex[i])
if(f[x]!=G.v[i]){
int y=G.v[i];
if(dfn[y]){
f[y]=x;
ring[x]=0;
tarjan(y);
if(!ring[x]) T.add(x,y);
}
else
if(dfn[y]<dfn[x]){
int z=x;
tot++;
while(z!=y){
T.add(z,tot);
ring[z]=1;
z=f[z];
}
T.add(tot,y);
ring[y]=1;
}
}
}
广义圆方树
普通圆方树只能解决仙人掌图上的问题,而广义圆方树则可以将所有无向图转化为圆方树处理。
广义圆方树性质:圆点方点相间,不存在两个‘’相同形状‘’的点相连。
构造方法:
把一条边连接两个点也看成一个点双,原本两个圆点有一条边相连,现在在中间插入一个方点间隔开就好了
(从别人blog搞来的图片)
代码
void tarjan(int x,int f){
dfn[x]=low[x]=++tim;
st[++tot]=x;
for(int i=G.head[x];i;i=G.nex[i])
if(G.v[i]!=f){
int y=G.v[i];
if(!dfn[y]){
tarjan(y,x);
low[x]=min(low[x],low[y]);
if(low[y]>=dfn[x]){
siz++;
while(st[tot]!=y)
T.add(n+siz,st[tot--]);
T.add(n+siz,st[tot--]);
T.add(n+siz,x);
}
}
else
low[x]=min(low[x],dfn[y]);
}
}
例题
比较晚了,先整理这些,以后再补吧
圆方树&广义圆方树[学习笔记]的更多相关文章
- 设备树(device tree)学习笔记
作者信息 作者:彭东林 邮箱:pengdonglin137@163.com 1.反编译设备树 在设备树学习的时候,如果可以看到最终生成的设备树的内容,对于我们学习设备树以及分析问题有很大帮助.这里我们 ...
- 设备树(device tree)学习笔记【转】
转自:https://www.cnblogs.com/pengdonglin137/p/4495056.html 阅读目录(Content) 1.反编译设备树 2.分析工具fdtdump 3.Linu ...
- 回文树/回文自动机(PAM)学习笔记
回文树(也就是回文自动机)实际上是奇偶两棵树,每一个节点代表一个本质不同的回文子串(一棵树上的串长度全部是奇数,另一棵全部是偶数),原串中每一个本质不同的回文子串都在树上出现一次且仅一次. 一个节点的 ...
- P4197 Peaks [克鲁斯卡尔重构树 + 主席树][克鲁斯卡尔重构树学习笔记]
Problem 在\(Bytemountains\)有\(n\)座山峰,每座山峰有他的高度\(h_i\) .有些山峰之间有双向道路相连,共\(M\)条路径,每条路径有一个困难值,这个值越大表示越难走, ...
- 树堆(Treap)学习笔记 2020.8.12
如果一棵二叉排序树的节点插入的顺序是随机的,那么这样建立的二叉排序树在大多数情况下是平衡的,可以证明,其高度期望值为 \(O( \log_2 n )\).即使存在一些极端情况,但是这种情况发生的概率很 ...
- 仙人掌&圆方树学习笔记
仙人掌&圆方树学习笔记 1.仙人掌 圆方树用来干啥? --处理仙人掌的问题. 仙人掌是啥? (图片来自于\(BZOJ1023\)) --也就是任意一条边只会出现在一个环里面. 当然,如果你的图 ...
- 【题解】Uoj#30 Tourist(广义圆方树+树上全家桶)
[题解]Uoj#30 Tourist(广义圆方树+树上全家桶) 名字听起来很霸气其实算法很简单.... 仙人掌上的普通圆方树是普及题,但是广义圆方树虽然很直观但是有很多地方值得深思 说一下算法的流程: ...
- CF487E Tourists + 圆方树学习笔记(圆方树+树剖+线段树+multiset)
QWQ果然我已经什么都学不会的人了. 这个题目要求的是图上所有路径的点权和!QWQ(我只会树上啊!) 这个如果是好啊 这时候就需要 圆方树! 首先在介绍圆方树之前,我们先来一点简单的前置知识 首先,我 ...
- 图论杂项细节梳理&模板(虚树,圆方树,仙人掌,欧拉路径,还有。。。)
orzYCB 虚树 %自为风月马前卒巨佬% 用于优化一类树形DP问题. 当状态转移只和树中的某些关键点有关的时候,我们把这些点和它们两两之间的LCA弄出来,以点的祖孙关系连成一棵新的树,这就是虚树. ...
随机推荐
- Finder打开剪切功能
在终端里输入 defaults write com.apple.finder AllowCutForItems 1 如果要改回来,把1改成0就可以了.
- secureCrt 开启Linux上的oracle服务
IP : 192.168.0.21 user: root pwd: 123456 --------------------------------------------------- ...
- window平台安装 MongoDB(二)
MongoDB提供了可用于32位和64位系统的预编译二进制包,你可以从MongoDB官网下载安装,MongoDB预编译二进制包下载地址:http://www.mongodb.org/downloads ...
- NHibernate二级缓存(第十一篇)
NHibernate二级缓存(第十一篇) 一.NHibernate二级缓存简介 NHibernate由ISessionFactory创建,可以被所有的ISession共享. 注意NHibernate查 ...
- 使用GitBook, Git github, Markdown 快速发布你的书籍
利用git作为版本管理和发布工具 你可以直接通过npm安装gitbook到全局 npm install -g gitbook gitbook只提供了如下四个命令 gitbook -h Usage: g ...
- ios - 使用@try、catch捕获异常:
@try { // 可能会出现崩溃的代码 } @catch (NSException *exception) { // 捕获到的异常exception } @finally { // 结果处理 }
- Entity Framework 4.1:复杂类型
这篇文章将讨论复杂类型. 默认情况下,EF4.1 将类映射到表,这是约定,但是有时候,我们需要模型比表的粒度更细一些. 地址是一个典型的例子,看一下下面的客户类. )] publicstring St ...
- plsql 详细安装及汉化步骤
方法/步骤 双击运行plsqldev715 安装完成后我们装中文补丁: 双击运行‘Chinese’应用程序 找到PLSQL的安装目录添加进来 中文补丁安装完成后我们需要进行orcl的配置,配置好才 ...
- 在jsp中嵌入javascript代码执行对html的影响方式
1 javascript的作用范围 javascript操作的是html dom树. 它可以用来直接写入html标签:修改html的内容:响应事件:修改html中的图像:修改html的样式等等. 2 ...
- S-形函数广泛应用于ANN 的激活函数
Logistic function hyperbolic tangent arctangent function Gudermannian function Error function ...