www.gusucode.com > 里面有最大流,最小费用最大流和着色问题的matlab程序和lingo程序 > 里面有最大流,最小费用最大流和着色问题的matlab程序和lingo程序/最大流,最小费用流,着色程序/WelshPowell.m

    function [paint,totalcolor] = WelshPowell( E )
%采用最大度数优先的Welsh_Powell算法解决着色问题,E为邻接矩阵(取值0,1),E(i,i)=0
%paint为2*n矩阵,paint(1,:)为顶点集合,paint(2,:)为对应点所着的颜色集合;totalcolor为使用的颜色总数
% 李阳   2010年4月22日
% E=[0 1 1 1 0 1 1
%    1 0 1 0 1 1 0
%    1 1 0 1 1 0 0 
%    1 0 1 0 1 0 1
%    0 1 1 1 0 0 0 
%    1 1 0 0 0 0 0 
%    1 0 0 1 0 0 0];
n=size(E,2);   %求E的顶点个数
degree=sum(E);  %按列求各顶点的度
[~,q]=sort(degree,'descend');  %q为各顶点按度排列后的索引
bepaint=repmat(1:n,n,1);     %初始化着色矩阵,每点赋颜色集1:n
for j=1:n        %最大度数优先求着色方案,每点着最小颜色编号所代表的颜色
    pjci=min(bepaint(q(j),:));  %q(j)着pjci色
    for k=j+1:n
        if E(q(j),q(k))==1     %若相邻,则不能着相同颜色
            index= find(bepaint(q(k),:)==pjci);
            bepaint(q(k),index) = bepaint(q(k),index) + inf;
        end
    end
end
paint=[1:n ; (min(bepaint,[],2))'];
totalcolor=length(unique(paint(2,:)));  %求所用颜色总数