序列可图化判定及顶点着色

 

1.度序列可图化问题

 

  可图化的度序列其表示的图并不唯一,即画出来的图有可能不是同构体,主要原因是由度序列产生生成矩阵的时候方法并不唯一。

  例子:度序列 [3 4 2 3 4 2]

1

2

  注意度数为3 的两个顶点在图1中并不连接,在图2中却相连,说明图12不是同构。

  对于可图化序列的简单图绘制需要用到生成矩阵,表示了随着顶点数增加而图拓展的过程。距离如下,度序列为 ,其相应的度序列矩阵为

                  

  生成矩阵的第i行等于度序列矩阵的第i行减去它的第i+1行得到,若度序列矩阵出现负值,则该序列不可图。

 

2.图顶点着色问题

  对一定图顶点着色,正常着色法要求相邻顶点颜色不能相同,其需要的的最小颜色数目为该图的色数。

 

  本程序采用最小度优先法对图进行着色,对度序列为[3 4 2 4 3 2]的两种不同图分布进行了实验,实验结果表明需要的最少色数都为4,结果与图论经典算法色数相同,没有最大度优先的Welsh-Powell算法好。

  该序列的第一种图:

  本算法最少正常色数为4,最大度优先的Welsh-Powell算法为3

  本算法最少正常色数为4,最大度优先的Welsh-Powell算法为4

  序列可图化判定、简单图绘制(需要用到生成矩阵)、顶点正常着色的MATLAB程序如下:

 1 %2015.5.30 by anchor
 2 %To judge  a sequence is degree sequence or not and draw up a simple graph
 3 %and color the vertex
 4 
 5 clc;clear all;clear
 6 
 7 %% ==================== Part 1: Input Sequence ====================
 8 fprintf('please input the sequence \n');
 9 DegreeSeq = str2num(input('The sequence DegreeSeq:','S'));
10 %Input sequence from txt
11 DegreeSeq=sort(DegreeSeq,'descend');
12 LenDegreeSeq=length(DegreeSeq);
13 %% ==================== Part 2: Preliminary Judgment ====================
14 if  mod(sum(DegreeSeq),2) == 1 || (DegreeSeq(1)>LenDegreeSeq-1 ||DegreeSeq(LenDegreeSeq)<0)
15     disp('this sequence is not degree sequence');
16     return;
17 end
18 %% ==================== Part 3: Degree Matrix & Generative Matrix ====================
19 %acoording to the theorem but no descending sort 
20 DegreeMat=zeros(LenDegreeSeq,LenDegreeSeq);
21 GenerativeMat = zeros(LenDegreeSeq,LenDegreeSeq);
22 DegreeMat(1,:)=DegreeSeq;
23 for i = 1:LenDegreeSeq-1
24     MaxDegree=max(DegreeSeq);
25     LocMaxDegree=(find(DegreeSeq==MaxDegree,1));
26     DegreeSeq(LocMaxDegree)=0;
27     location = MaxNLocation(DegreeSeq,MaxDegree);
28     DegreeSeq(location)=DegreeSeq(location)-1;    
29     DegreeMat(i+1,:)=DegreeSeq;
30     if min(DegreeMat(i+1,:)) < 0
31     disp('this sequence is not degree sequence');
32     return;
33     end  
34     GenerativeMat(i,:) = DegreeMat(i,:) - DegreeMat(i+1,:); 
35 end
36 % GenerativeMat=[4 1 1 1 0 1;0 3 1 1 1 0;0 0 1 0 1 0;0 0 0 1 0 1;0 0 0 0 0 0;0 0 0 0 0 0];
37 %% ==================== Part 4: Draw Up Simple Graph ====================
38 if DegreeMat(LenDegreeSeq,LenDegreeSeq)==0
39  disp('this sequence is degree sequence');
40 end
41 
42 [x,y]=NUniteCircle(LenDegreeSeq+1);
43 scatter(x,y,'p','filled');%将每个点单独画成五角星
44 hold on;
45 
46 for i = 1:LenDegreeSeq
47     j = LenDegreeSeq-i+1;
48     MaxDegree=max(GenerativeMat(j,:));
49     if MaxDegree ~= 0
50         Temp = GenerativeMat(j,:);    
51         LocMaxTemp = find(Temp == MaxDegree,1);
52         Temp(LocMaxTemp) = 0;
53         LocNonZero=find(Temp~=0);
54         for k=1:length(LocNonZero)
55             plot([x(LocNonZero(k)) x(LocMaxTemp)],[y(LocNonZero(k)) y(LocMaxTemp)]);
56             hold on;
57         end
58     end
59 end
60 pause;
61 disp('现在开始顶点着色');
62 %% ==================== Part 5: Color The Vertex ====================
63 color = rand(GenerativeMat(1,1)+1,3);
64 colorsequence = 1:(GenerativeMat(1,1)+1);
65 colorSchedule = 1;
66 for i = 1:LenDegreeSeq
67     j = LenDegreeSeq-i+1;
68     MaxDegree=max(GenerativeMat(j,:));
69     if MaxDegree ~= 0 
70         Temp = GenerativeMat(j,:);
71         LocMaxTemp = find(Temp == MaxDegree,1);
72         Temp(LocMaxTemp) = 0;
73         Color0Postion = max((find(Temp == 0)));
74         Color1Postion = find(Temp == 1);
75         colorSchedule = min(setdiff(colorsequence,VertexColo(Color1Postion)));
76         plot(x(LocMaxTemp),y(LocMaxTemp),'p','color',color(colorSchedule,:),'linewidth',3); hold on;  
77     end
78     plot(x(j),y(j),'p','color',color(colorSchedule,:),'linewidth',3); hold on;  
79     hold on;
80     VertexColo(j) = colorSchedule;
81 end

 

posted @ 2015-05-30 15:30  LaoAnchor  阅读(1258)  评论(0编辑  收藏  举报