仙人掌

圆方树是用来解决仙人掌图的问题的,那什么是仙人掌图呢?

如图,不存在边同时属于多个环无向连通图是一棵仙人掌



圆方树

定义

原先的仙人掌图,通过一些奇妙的方法,可以转化为一棵由圆点,方点和树边构成的树——圆方树,具体构建方法如下

原仙人掌的每一个点为圆点,对于每个环都新建一个方点,方点向环上的每一个圆点连边,就构成了圆方树。


构建方法

用\(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]);
}
}


例题

Luogu 4320

比较晚了,先整理这些,以后再补吧

圆方树&广义圆方树[学习笔记]的更多相关文章

  1. 设备树(device tree)学习笔记

    作者信息 作者:彭东林 邮箱:pengdonglin137@163.com 1.反编译设备树 在设备树学习的时候,如果可以看到最终生成的设备树的内容,对于我们学习设备树以及分析问题有很大帮助.这里我们 ...

  2. 设备树(device tree)学习笔记【转】

    转自:https://www.cnblogs.com/pengdonglin137/p/4495056.html 阅读目录(Content) 1.反编译设备树 2.分析工具fdtdump 3.Linu ...

  3. 回文树/回文自动机(PAM)学习笔记

    回文树(也就是回文自动机)实际上是奇偶两棵树,每一个节点代表一个本质不同的回文子串(一棵树上的串长度全部是奇数,另一棵全部是偶数),原串中每一个本质不同的回文子串都在树上出现一次且仅一次. 一个节点的 ...

  4. P4197 Peaks [克鲁斯卡尔重构树 + 主席树][克鲁斯卡尔重构树学习笔记]

    Problem 在\(Bytemountains\)有\(n\)座山峰,每座山峰有他的高度\(h_i\) .有些山峰之间有双向道路相连,共\(M\)条路径,每条路径有一个困难值,这个值越大表示越难走, ...

  5. 树堆(Treap)学习笔记 2020.8.12

    如果一棵二叉排序树的节点插入的顺序是随机的,那么这样建立的二叉排序树在大多数情况下是平衡的,可以证明,其高度期望值为 \(O( \log_2 n )\).即使存在一些极端情况,但是这种情况发生的概率很 ...

  6. 仙人掌&圆方树学习笔记

    仙人掌&圆方树学习笔记 1.仙人掌 圆方树用来干啥? --处理仙人掌的问题. 仙人掌是啥? (图片来自于\(BZOJ1023\)) --也就是任意一条边只会出现在一个环里面. 当然,如果你的图 ...

  7. 【题解】Uoj#30 Tourist(广义圆方树+树上全家桶)

    [题解]Uoj#30 Tourist(广义圆方树+树上全家桶) 名字听起来很霸气其实算法很简单.... 仙人掌上的普通圆方树是普及题,但是广义圆方树虽然很直观但是有很多地方值得深思 说一下算法的流程: ...

  8. CF487E Tourists + 圆方树学习笔记(圆方树+树剖+线段树+multiset)

    QWQ果然我已经什么都学不会的人了. 这个题目要求的是图上所有路径的点权和!QWQ(我只会树上啊!) 这个如果是好啊 这时候就需要 圆方树! 首先在介绍圆方树之前,我们先来一点简单的前置知识 首先,我 ...

  9. 图论杂项细节梳理&模板(虚树,圆方树,仙人掌,欧拉路径,还有。。。)

    orzYCB 虚树 %自为风月马前卒巨佬% 用于优化一类树形DP问题. 当状态转移只和树中的某些关键点有关的时候,我们把这些点和它们两两之间的LCA弄出来,以点的祖孙关系连成一棵新的树,这就是虚树. ...

随机推荐

  1. php优化(php.ini)

    PHP优化 ------------------------------------- 尽量选择php5.4及以上的版本,里面很多优化参数已经移除了相比以前版本   1.引擎解析优化和加速 1)eac ...

  2. oracle中避免sort操作

    1.升序排列 create index ix_table1 on table1 (column1,column2); select column1,column2 from table1 order ...

  3. "fcitx按ctrl+space没反应"解决方法

    如果是KDM.GDM.LightDM,打开~/.xprofile.如果是startx.Slim,打开~/.xinitrc.(没有就新建一个) export GTK_IM_MODULE=fcitxexp ...

  4. homebrew可以管理众多开源软件的安装和卸载

    通过homebrew可以管理众多开源软件的安装和卸载. 参考https://github.com/mxcl/homebrew/wiki 1. 安装: ruby -e "$(curl -fsS ...

  5. java中什么是bridge method(桥接方法)

    java中什么是bridge method(桥接方法) https://blog.csdn.net/z69183787/article/details/81115524

  6. Android注解支持(Support Annotations) (转)

    原文地址:http://www.flysnow.org/2015/08/13/android-tech-docs-support-annotations.html 注解支持(Support Annot ...

  7. python tensorflow 安装

    我是先下载tensorflow-1.5.0rc1-cp36-cp36m-win32.whl,再执行命令行安装的 下载地址:https://pypi.python.org/pypi/tensorflow ...

  8. memcache 使用方法

    Memcache::add // 添加一个值,如果已经存在,则返回falseMemcache::addServer // 添加Memcache地址Memcache::close // 关闭一个Memc ...

  9. 替换jar包内指定的文件

    用Java jar 工具来替换. ① jar uvf test.jar test.class 把test.class 直接添加到jar包的根目录,也就是替换到根目录文件. ②jar uvf test. ...

  10. 我自己曾经经历的CMMI3认证通过关于软件测试的访谈【转载】

    转自<http://blog.csdn.net/jcy58/article/details/51908884> 因为当初我在公司里是负责软件测试工作的,所以CMMI3和测试相关的访谈,就是 ...