圆方树&广义圆方树[学习笔记]
仙人掌
圆方树是用来解决仙人掌图的问题的,那什么是仙人掌图呢?
如图,不存在边同时属于多个环的无向连通图是一棵仙人掌
圆方树
定义
原先的仙人掌图,通过一些奇妙的方法,可以转化为一棵由圆点,方点和树边构成的树——圆方树,具体构建方法如下
原仙人掌的每一个点为圆点,对于每个环都新建一个方点,方点向环上的每一个圆点连边,就构成了圆方树。
构建方法
用\(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弄出来,以点的祖孙关系连成一棵新的树,这就是虚树. ...
随机推荐
- HDU 4417 划分树+二分
题意:有n个数.m个询问(l,r,k),问在区间[l,r] 有多少个数小于等于k. 划分树--查找区间第k大的数.... 利用划分树的性质.二分查找在区间[l,r]小于等于k的个数. 假设在区间第 i ...
- Android sdk 更新失败解决方发整理
解决办法: 设置本地hosts windows里hosts位置在C:\Windows\System32\drivers\etc,找到hosts文件 直接在hosts文件的最后加一行: 74.125.2 ...
- EasyNetQ操作RabbitMQ(高级消息队列)
RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件).写消息队列的时候用RabbitMQ比较好,但是写的时候需要自己封装下,自己的封装,就需要对RabbitM ...
- iOS 渐变色实现,渐变色圆环,圆环进度条
CAGradientLayer图层可以通过设置mask来给视图添加渐变效果 CAGradientLayer主要需要设置一下几个参数 colors:传入需要渐变的颜色 例如 self.gradientL ...
- android Webview 实现js调用java代码实现Activity跳转
今天有了一个需求,在android里webview加载的html页面,要求点击html页面的按钮实现Activity的跳转. 咱是是菜鸟,webview的接触不多,于是就和度娘来了次亲密接触.在其中也 ...
- openwrt修改密码
默认情况下root是没有密码的 需要设置密码后才能开启ssh 修改/etc/shadow文件: root:$1$wEehtjxj$YBu4quNfVUjzfv8p/PBo5.:0:0:99999:7: ...
- 织梦DedeCMS自定义表单提交成功后返回当前页面的教程
织梦的自定义表单制作的留言,报名等功能,提交成功后会自动返回到首页,那么如何让它返回到当前页面呢? 方法如下: 打开plus/diy.php文件 找到 showmsg($bkmsg, $goto); ...
- VSCode 运行go test显示打印日志
在VSCode中运行go test,在代码中写的 fmt.Printf("TestB \n") 这些语句均不打印,只显示最终的结果 PASS ok github.com/B .03 ...
- hiho一下 第二周&第四周:从Trie树到Trie图
hihocoder #1014 题目地址:http://hihocoder.com/problemset/problem/1014 hihocoder #1036 题目地址: http://hihoc ...
- EasyPlayer.js H5播放器帮助我这种不会前端的普通用户也能轻松实现直播接入
说到EasyPlayer.js,先得说一下EasyPlayer到底是啥, An elegant, simple, fast android RTSP/RTMP/HLS/HTTP Player.Easy ...