数据结构实验报告四-地图染色问题

数据结构实验报告四-地图染色问题
数据结构实验报告四-地图染色问题

数据结构

实验名称:实验五题目3 地图染色问题

学生姓名:xxx ________________班级:2013211128______________班内序号:xx__________________学号:2013210783______________日期:2014/12/19_____________

1.实验目的

目的:

掌握图基本操作的实现方法

了解最小生成树的思想和相关概念

了解最短路径的思想和相关概念

学习使用图解决实际问题的能力

内容:

对下图所示的地图进行染色,要求使用尽可能少的颜色进行染色,完成该算法。测试数据:

2. 程序分析

2.1 存储结构

二维数组

struct Color

{

int Num;

int Links;

}; 2.2 程序流程

2.3 关键算法分析 算法1:void Arrange(int map[][N],Color a[])

[1] 算法功能:对邻接矩阵的顶点按度进行排序

[2] 算法基本思想:计算每个顶点的度数,然后进行冒泡排序

[3] 算法空间、时间复杂度分析:O (n^2)

[4] 代码逻辑

void Arrange(int map[][N],Color a[])

{ 对地图所对应的邻接矩阵

按度排序顶点序号 进行染色 判断当前染色顶点与相邻顶点颜色是否相同 直到所有顶点染色完毕,显示染色结果

染色下一个顶点 重新寻找有效颜色进行染色 是 否

for (int i=0;i

{

a[i].Num=i;

a[i].Links=0;

for (int j=0;j

a[i].Links=a[i].Links+map[i][j];

}

for (int i=1;i

for (int j=0; j

if (a[j].Links

{

Color tmp=a[j];

a[j]=a[j+1];

a[j+1]=tmp;

}

}

算法2:bool flag(int map[N][N], int ver, int col[])

[1] 算法功能:判断相邻顶点的颜色是否重复

[2] 算法基本思想:比较相邻顶点的颜色是否相同,相同的话返回值为false

[3] 算法空间、时间复杂度分析:O(n)

[4] 代码逻辑

bool flag(int map[N][N], int ver, int col[]) //判断该颜色是否可用

{

for(int i=0; i

if(map[ver][i]==0)

continue; //顶点i和顶点ver不相邻,继续

else if(col[ver]==col[i])

return false; //i和ver相邻,并且颜色相同,该颜色不合适

return true;

}

3.程序运行结果分析

4.总结

4.1实验的难点和关键点

难点及关键点:

对相邻顶点的颜色进行判断比较,如果相同则需要替换——用一个bool值来判断是否对颜色进行更改

4.2心得体会

通过这次的编程实验,我熟悉地掌握图基本操作的实现方法,了解了最小生成树的思想和相关概念,也明白了最短路径的思想和相关概念,并且学会了使用图解决实际问题,可谓受益匪浅。

5.源程序

#include

using namespace std;

const int N = 7;

struct NODE

{

int ID;

int Links;

};

void SortNode(int b[][N],NODE SN[])

{

for (int i=0;i

{

SN[i].ID = i; SN[i].Links = 0; //初始化顶点信息

for (int j=0;j

SN[i].Links += b[i][j]; //计算每个顶点的度

}

for (int i=1;i

for (int j=0; j

if (SN[j].Links

{

NODE tmp = SN[j];

SN[j] = SN[j+1];

SN[j+1] = tmp;

}

}

bool IsValid(int b[N][N], int k, int x[])

//判断该颜色是否可用,b是邻接矩阵,k是当前染色的顶点序号,x是顶点颜色数组 { for(int i=0; i

if(!b[k][i])

continue; //i和k不相邻,继续

else if( x[k]== x[i])

return false; //i和k相邻,并且颜色相同,该颜色不合适

return true;

}

void main()

{

int x[N]={0}; //顶点颜色数组,用来保存最后的染色结果

int b[N][N] = { 0,1,1,1 ,1,1,1, //所示的邻接矩阵

1,0,1,0,0,0,0,

1,1,0,1,1,0,0,

1,0,1,0,0,0,0,

1,0,1,0,0,1,0,

1,0,0,0,1,0,0,

1,0,0,0,0,0,0};

NODE Node[N];

SortNode(b,Node);//按度数排序的顶点序号

int k=0;

while (k>=0)

{

x[Node[k].ID] = x[Node[k].ID] + 1;

while(!IsValid(b, Node[k].ID, x)) //着色无效继续再当前层搜索有效的颜色 x[Node[k].ID] = x[Node[k].ID] + 1;

if(k==N-1)

break; //染色完毕

else

k++; //为下一个结点着色

}

for(int j=0; j

cout <<"顶点"<

system("pause"); }

相关主题
相关文档
最新文档