弦图(Chordal Graph)学习小记
Posted alan_cty
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了弦图(Chordal Graph)学习小记相关的知识,希望对你有一定的参考价值。
前言
这是个什么神仙玩意儿?(仙图
先把结论贴出来方便背板,证明什么的啃完再补
考NOI前千万不要点开什么毒瘤的技能树
所以现在点
由于很懒所以想到哪写到哪
一些约定
G
G
G无向图
G
[
S
]
G[S]
G[S]点集S的诱导子图
δ
(
S
)
\\delta(S)
δ(S)点集S的临集
一些定义
弦
连接环上不相邻两点之间的边
弦图
任意长度>=4的环都有至少一条弦的图
这是弦图,这不是弦图.jpg
单纯点
一个点v是单纯点当且仅当 G [ δ ( v ) ] + v G[\\delta(v)]+v G[δ(v)]+v是团
完美消除序列
一个n的排列v1,v2,v3…vn,满足vi在vi,vi+1,vi+2…vn的诱导子图中是一个单纯点
一些性质
弦图的判定
一个图是弦图当且仅当其有完美消除序列
最大势算法(MCS)
每个点有一个标号label[v],初始label[v]=0
从后往前确定完美消除序列中的每一个元素,每次选择label最大的点v加入序列,并将
δ
(
v
)
\\delta(v)
δ(v)中的点的label+1
具体实现可以开n个队列,不需要删除
复杂度O(n+m)
void MCS()
int mx=0;
fo(i,0,n) lst[i+n+1]=0;
fo(i,1,n) sz[i]=0,vis[i]=0,add(n+1,i);
fd(j,n,1)
int p=0;
for(++mx;!p;)
--mx;int Id=mx+n+1;
while (int k=lst[Id])
int x=t[k];
lst[Id]=nxt[k];
if (!vis[x])
vis[x]=1;
rep(i,x)
int y=t[i];
if (!vis[y])
mx=max(mx,++sz[y]);
add(sz[y]+n+1,y);
p=x;
break;
seq[rk[p]=j]=p;
弦图的判定
bzoj1242
先跑一边MCS,然后考虑判定每个点是不是单纯点
直接暴力是O((∑deg)^2)的,设
α
(
v
)
\\alpha(v)
α(v)表示v在完美消除序列中的排名,v1,v2…vk表示
δ
(
v
)
\\delta(v)
δ(v)中
α
\\alpha
α大于v的点按
α
\\alpha
α排序之后的序列,那么只需要判断v1是否和v2…vk相邻即可。
弦图的极大团
设
N
(
v
)
=
u
∣
u
∈
δ
(
v
)
且
α
(
u
)
>
α
(
v
)
N(v)=u|u\\in\\delta(v)且\\alpha(u)>\\alpha(v)
N(v)=u∣u∈δ(v)且α(u)>α(v)
定理:弦图中所有的团都满足是
v
∪
N
(
v
)
v\\cup N(v)
v∪N(v)的形式
如何判断某一个
v
∪
N
(
v
)
v\\cup N(v)
v∪N(v)是不是极大团?
若存在u,令
A
=
u
∪
N
(
u
)
A=u\\cup N(u)
A=u∪N(u)
B
=
v
∪
N
(
v
)
B=v\\cup N(v)
B=v∪N(v),若
B
⊆
A
B\\subseteq A
B⊆A则
v
∪
N
(
v
)
v\\cup N(v)
v∪N(v)不是极大团
显然此时
α
(
w
)
<
α
(
v
)
\\alpha(w)<\\alpha(v)
α(w)<α(v)
令
n
x
t
[
v
]
nxt[v]
nxt[v]表示
N
(
v
)
N(v)
N(v)中最前的点,
w
∗
w*
w∗表示所有满足
B
⊆
A
B\\subseteq A
B⊆A的w的最后的一个点。
那么此时有
n
x
t
[
w
∗
]
=
v
nxt[w*]=v
nxt[w∗]=v
于是我们只需要判定所有
n
x
t
[
w
]
=
v
nxt[w]=v
nxt[w]=v的点w
判定的话只需要
∣
N
(
v
)
∣
+
1
<
=
∣
N
(
w
)
∣
|N(v)|+1<=|N(w)|
∣N(v)∣+1<=∣N(w)∣
以上是关于弦图(Chordal Graph)学习小记的主要内容,如果未能解决你的问题,请参考以下文章