【转】弦图判定及最小染色数
弦图:所有长度大于3的环均有弦的图叫弦图。
完美消除序列:一个序列{v1,v2,…,vn},满足{vi+1,vi+2,…,vn}中与vi相邻的点的诱导子图为完全图。
弦图的判定(ZOJ 1015)可以采用MCS算法:
基于 定理:一个图无向图是弦图当且仅当它有完美消除序列。
首先找出消除序列:
0.i=n
1.找到一个u∈{j|label[j]=max{label[k]}(k为未标号点)},order[u]=i
2.--i,所有与u相邻的v且++label[v],回到1
也就是说,每次找现有未标号的点中,与已标号的点相邻最多的那个,标号。
然后判断该序列是否是完美消除序列:
对于每一个vi,找到{vi+1,vi+2,…,vn}中与vi相邻的标号最小的点vj,判断其它{vi+1,vi+2,…,vn}中与vi相邻的点是否与vj相邻,若不相邻则不是完美消除序列。
最小染色数(HNOI2008 神奇的国度)可以这样做:
在完美消除序列基础上,从最大标号开始,贪心地染色,最后用了几种颜色即为答案。
只是我想不通为什么CDQ那份PPT里说MCS和染色的复杂度是O(n+m),我只会写O(n^2+m)的…
完美消除序列:一个序列{v1,v2,…,vn},满足{vi+1,vi+2,…,vn}中与vi相邻的点的诱导子图为完全图。
弦图的判定(ZOJ 1015)可以采用MCS算法:
基于 定理:一个图无向图是弦图当且仅当它有完美消除序列。
首先找出消除序列:
0.i=n
1.找到一个u∈{j|label[j]=max{label[k]}(k为未标号点)},order[u]=i
2.--i,所有与u相邻的v且++label[v],回到1
也就是说,每次找现有未标号的点中,与已标号的点相邻最多的那个,标号。
然后判断该序列是否是完美消除序列:
对于每一个vi,找到{vi+1,vi+2,…,vn}中与vi相邻的标号最小的点vj,判断其它{vi+1,vi+2,…,vn}中与vi相邻的点是否与vj相邻,若不相邻则不是完美消除序列。
最小染色数(HNOI2008 神奇的国度)可以这样做:
在完美消除序列基础上,从最大标号开始,贪心地染色,最后用了几种颜色即为答案。
只是我想不通为什么CDQ那份PPT里说MCS和染色的复杂度是O(n+m),我只会写O(n^2+m)的…
定义:
无向图中,如果任意边数大于3的环,至少存在一条边连接环中不相邻的某两
个点,则称此图为弦图(Chordal Graph)。
zoj1015的题目:
判断无向图是否为弦图,是则输出Perfect,否则输出Imperfect。
以下是时间复杂度为O(n+m)的算法,n是图的点数,m是图的边数。
第一步:给节点编号
设已编号的节点集合为A,未编号的节点集合为B
开始时A为空,B包含所有节点。
for num=n-1 downto 0 do
{
在B中找节点x,使与x相邻的在A集合中的节点数最多,将x编号为num,
并从B移入A
}
第二步:检查
for num=0 to n-1 do
{
对编号为num的节点x,设所有编号大于num且与x相邻的节点集合为C,
在集合C中找出编号最小的节点y,如果集合C中存在不等于y的节点z,
且y与z间没有边,则此图不是弦图,退出。
}
检查完了,则此图是弦图。
无向图中,如果任意边数大于3的环,至少存在一条边连接环中不相邻的某两
个点,则称此图为弦图(Chordal Graph)。
zoj1015的题目:
判断无向图是否为弦图,是则输出Perfect,否则输出Imperfect。
以下是时间复杂度为O(n+m)的算法,n是图的点数,m是图的边数。
第一步:给节点编号
设已编号的节点集合为A,未编号的节点集合为B
开始时A为空,B包含所有节点。
for num=n-1 downto 0 do
{
在B中找节点x,使与x相邻的在A集合中的节点数最多,将x编号为num,
并从B移入A
}
第二步:检查
for num=0 to n-1 do
{
对编号为num的节点x,设所有编号大于num且与x相邻的节点集合为C,
在集合C中找出编号最小的节点y,如果集合C中存在不等于y的节点z,
且y与z间没有边,则此图不是弦图,退出。
}
检查完了,则此图是弦图。