资源简介
两种方法,第一种递归回溯法,第二种是贪心法。 已知中国地图,请设计地图着色软件,对各省进行着色,要求相邻省所使用的颜色不同,并保证使用的颜色最少。
代码片段和文件信息
#include
#include
#include
#define Max 50
using namespace std;
class Graph //图的类
{
public:
int n;//顶点
int e;//边
string vex[Max]; //顶点信息
int Edge[Max][Max];//顶点与顶点之间的联系
Graph(int n0int e0){n=n0;e=e0;}//构造函数
void Input(); //图的输入
int IsEdge(int v1int v2);//判断v1v2之间是否有边
int check(string a);
};
class color_greedy;
class subset //子集类
{
public:
friend class color_greedy; //char-greedy是其友元类
int *newclr;//指向子集所包含的各个结点序号
int n; //子集中结点个数
int color;//该子集所赋给的颜色值
subset(int newcolor=0int m=Max);//构造函数
~subset(){delete newclr;}//析构函数
};
class color_greedy
{
public:
Graph g;//要着色的图
subset *u;//子集集合
int *x; //各结点的着色值向量
int n ; //图的结点个数
int m ; //可选的m 种颜色
color_greedy(int n0int m0int e0);//构造函数
~color_greedy(){delete x; delete []u;}//析构函数
void greedy(subset &y );//贪心法找子集y中包含的结点
void Coloring ();//产生图的着色方案
};
/*************************Graph.cpp*****************/
int Graph::check(string a)
{
for(int i=0;i if(vex[i]==a)
return i;
return -1;
}
void Graph::Input() //地图的输入
{
ifstream fin(“ChinaMapColoring.txt“);
if(!fin)
{
cerr<<“文件打开失败“;
exit(1);
}
cout< system(“pause“);
system(“cls“);
cout<<“中国地图共有有23个省、5个自治区、4个直辖市、2个特别行政区.........“< for(int i=0;i fin>>vex[i];
cout<<“这些省份分别是:“< for(i=0;i {
cout< if((i+1)%7==0)
cout< }
cout< system(“pause“);
system(“cls“);
cout< system(“pause“);
system(“cls“);
int pq;
string ab;
for(i=0;i for(int j=0;j Edge[i][j]=0;
cout< cout<<“这些相邻关系分别为:“<
for(i=0;i {
fin>>a;
fin>>b;
p=check(a);
q=check(b);
Edge[p][q]=Edge[q][p]=1;//矩阵存储
cout< if((i+1)%3==0)
cout< }
cout< fin.close();
}
int Graph::IsEdge(int v1int v2)
{
if(Edge[v1][v2]>0)
return 1;
else return 0;
}
/*******************************subset.cpp***********************/
subset::subset(int newcolorint m)
{
n=m;
if(n>0)
newclr=new int[n];
else
newclr=0;
color=newcolor;
}
/*****************************color_greedy.cpp********************/
color_greedy::color_greedy(int n0int m0int e0):g(n0e0)
{
n=n0;
m=m0;
x=new int[n];//创建x 向量
for(int i=0;i x[i]=0;//初始化向量x
u=new subset[m];//创建m个子集
g.Input();
}
void color_greedy::greedy(subset &y)
{
int vp=0q=1w;
for(int i=0;i if(x[i]==0)
{
v=i;
break;
}
y.newclr[0]=v;//将结点v加入新的颜色值子集
x[v]=y.color;//将结点v赋给新的颜色值
for(i=0;i {
if(x[i]==0)
{
v=i;//找图中未着色的结点v
p=q-1;//q为当前子集中包含的结点个数
while(p>=0)
{
w=y.newclr[p];//取子集中一个结点w
if(g.IsEdge(vw))break;//若v和w邻接,则v不能赋给该新颜色值
els
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2011-03-28 13:56 地图着色\
目录 0 2011-03-28 13:56 地图着色\贪心法\
文件 908 2010-09-14 20:29 地图着色\贪心法\ChinaMapColoring.txt
目录 0 2011-03-28 13:56 地图着色\贪心法\Debug\
文件 91136 2010-09-16 14:17 地图着色\贪心法\Debug\vc60.idb
文件 110592 2010-09-16 14:17 地图着色\贪心法\Debug\vc60.pdb
文件 577619 2010-09-16 14:17 地图着色\贪心法\Debug\图着色初做.exe
文件 829116 2010-09-16 14:17 地图着色\贪心法\Debug\图着色初做.ilk
文件 297525 2010-09-16 14:17 地图着色\贪心法\Debug\图着色初做.obj
文件 2165364 2010-09-15 19:30 地图着色\贪心法\Debug\图着色初做.pch
文件 1156096 2010-09-16 14:17 地图着色\贪心法\Debug\图着色初做.pdb
文件 4539 2010-09-16 14:17 地图着色\贪心法\图着色初做.cpp
文件 3451 2010-09-16 14:17 地图着色\贪心法\图着色初做.dsp
文件 545 2010-09-16 14:18 地图着色\贪心法\图着色初做.dsw
文件 50176 2010-09-16 14:18 地图着色\贪心法\图着色初做.ncb
文件 48640 2010-09-16 14:18 地图着色\贪心法\图着色初做.opt
文件 766 2010-09-16 14:17 地图着色\贪心法\图着色初做.plg
目录 0 2011-03-28 13:56 地图着色\递归回溯法\
文件 908 2010-09-14 20:29 地图着色\递归回溯法\ChinaMapColoring.txt
目录 0 2011-03-28 13:56 地图着色\递归回溯法\Debug\
文件 82944 2010-09-17 19:59 地图着色\递归回溯法\Debug\vc60.idb
文件 118784 2010-09-15 22:38 地图着色\递归回溯法\Debug\vc60.pdb
文件 577623 2010-09-17 19:59 地图着色\递归回溯法\Debug\图着色初做.exe
文件 828436 2010-09-17 19:59 地图着色\递归回溯法\Debug\图着色初做.ilk
文件 294612 2010-09-17 19:59 地图着色\递归回溯法\Debug\图着色初做.obj
文件 2165364 2010-09-15 19:26 地图着色\递归回溯法\Debug\图着色初做.pch
文件 1156096 2010-09-15 22:38 地图着色\递归回溯法\Debug\图着色初做.pdb
文件 3633 2010-09-15 22:24 地图着色\递归回溯法\图着色初做.cpp
文件 3451 2010-09-17 19:59 地图着色\递归回溯法\图着色初做.dsp
文件 545 2010-09-17 20:08 地图着色\递归回溯法\图着色初做.dsw
文件 41984 2010-09-17 20:08 地图着色\递归回溯法\图着色初做.ncb
............此处省略2个文件信息
评论
共有 条评论