20101910072卢富毓——二部图的边染色问题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

云南大学数学与统计学院

实 验 报 告

一、实验目的

掌握二部图边染色数问题和二部图最大匹配问题的求解算法,给出二部图的边染色方案 二、实验环境

VS2010(C++) 三、实验内容 给定一个二部图()E V G ,=,求边染色数()G 'χ,并给出染色方案。

四、 实验过程 A.二部图边染色问题求解思想

1) 对于给定的二部图G ,利用二部图最大匹配算法求得G 的一个最大匹配M 1,对G 1=G-M 1再利用二部图匹配算法求得G 1的一个最大匹配M 2,..., 这样可以得到图G 的边子集被划分成()G ∆个集合∆M M M ,...,,21,从而可对G 进行()G ∆染色。根据定理6.1,设()E T S G ;,=是一个二部图,则()()G G ∆='χ,其中()G ∆为G 的最大的度。

2) 二部图最大匹配算法 设图G=(S,T;E)为二部图,可用反圈法求二部图的匹配

① 选初值:取(){}的未盖点

是关于M |0u S u X ∈= ② 在()()k X Φ中选边j i u u 原则,这里()()()

k j k i X V u X u -∈∈,:

若()S X u k i ⋂∈,则只能选以i u 为端点的非M 边

若()T X u k i ⋂∈,则只能选以i u 为端点的M 边

③ 若在某步出现下列情形之一停止 情形1:()k X 中有T 型未盖点,即已找到增广路P ,进行增广匹配,构造新的匹配 ()()()()M P E P E M P E M M -⋃-=⊕=)('

情形2:上述情形1不存在,而()()k X Φ中无边可选,说明G 不存在关于M 的增广路,进而M 为最大匹配。

B.实现过程

对任意给定的一个图,首先判断它是否为二部图,若是二部图,则给出二部图的边染色方案,若不是二部图,程序结束。二部图的S 集和T 集的划分,这里采用如下定义: (){}(){}是奇数,是偶数v u d V u T v u d V u S ,|,|∈=∈=,计算两点之间的最短距离用到的是

Dijkstra算法(令各边权值为1),注意到二部图可能是不连通图,在代码实现过程中也加入了相关设计,保证程序的健壮性,运行结果中给出一个测试实例。

运行结果:

五、实验总结

求二部图的边染色数方案是基于二部图的最大匹配算法的实现,了解了设计思路之后解决的时候可能是非常简单的。但是对一般图来说,求二部图的边染色数是NP-完备问题,如何解决还需要查阅相关资料。

六、源代码

#include

#include

#include

using namespace std;

#define Max_vex 100

#define M 1000

//SetTextC1是原来的颜色

//SetTextC2 是设置的输出输入颜色

#define SetTextC1 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN |FOREGROUND_BLUE)

#define SetTextC2 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | FOREGROUND_GREEN)

#define SetTextC3 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE)

#define SetTextC4 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | FOREGROUND_RED)

#define SetTextC5 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_BLUE)

#define SetTextC6 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED |

FOREGROUND_GREEN |FOREGROUND_BLUE)

#define SetTextC7 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN)

class Arcll{

public:

int weight; //权重

bool m; //TRUE—匹配边,FALSE—自由边

};

class Vex{

public:

string v;

char c; //S,T

bool m; //TRUE—已盖点,FALSE—未盖点

int from;//增广路调整

};

class Graphics{ //创建一个图的类

private:

int vexnum; //顶点数

int arcnum; //边数

int maxdegree;

Vex vexs[Max_vex]; //顶点

Arcll arcs[Max_vex][Max_vex]; //边数

public:

void CreateGraphics(Graphics &G);//创建一个图

int LocateIndex(Graphics G, string v);// 寻找下标

bool DijkStra(Graphics &G); //划分S集和T集

void Match(Graphics &G); //二部图的最大匹配算法

void Color(Graphics &G); //染色

void GivenMethod(Graphics &G,int k);//给出染色方案

相关文档
最新文档