弦图(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)=uuδ(v)α(u)>α(v)
定理:弦图中所有的团都满足是 v ∪ N ( v ) v\\cup N(v) vN(v)的形式
如何判断某一个 v ∪ N ( v ) v\\cup N(v) vN(v)是不是极大团?
若存在u,令 A = u ∪ N ( u ) A=u\\cup N(u) A=uN(u) B = v ∪ N ( v ) B=v\\cup N(v) B=vN(v),若 B ⊆ A B\\subseteq A BA v ∪ N ( v ) v\\cup N(v) vN(v)不是极大团
显然此时 α ( w ) &lt; α ( v ) \\alpha(w)&lt;\\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 BA的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 &lt; = ∣ N ( w ) ∣ |N(v)|+1&lt;=|N(w)| N(v)+1<=N(w)

以上是关于弦图(Chordal Graph)学习小记的主要内容,如果未能解决你的问题,请参考以下文章

弦图

图论8月19日前填坑指南(自用)

Windows Media Foundation 音视频采集 小记

安全预警暗云Ⅲ木马攻击预警

emWin notes

Morris图表使用小记