20101910072卢富毓——二部图的边染色问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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);//给出染色方案