- 38
- 0
- 约2.78千字
- 约 4页
- 2017-09-02 发布于浙江
- 举报
算法分析与设计实验报告装载问题图的m着色问题
实验报告
课程 计算机算法设计与分析 实验名称 装载问题、图的m着色问题 学号 姓名 实验日期:
实验四 装载问题、图的m着色问题
一.实验目的
学习装载问题的简单算法,掌握原理,运用C++编程实现。
学习图的m着色问题的简单算法,掌握原理,运用C++编程实现。
二.实验内容
(1)设计转载问题的算法,上机编程实现。
(2)设计图的m着色问题的算法,上机编程实现。
三.实验代码
1 . 装载问题的程序代码如下:
#includeiostream
using namespace std;
templateclass Type
class Loading{
friend Type MaxLoading(Type [],Type,int,int []);
private:
void Backtrack(int i);
int n,
*x,
*bestx;
Type *w,
c,
cw,
bestw,
r;
};
templateclass Type
void LoadingType::Backtrack(int i)
{ if(in){
if(cwbestw) {for(int j=1;j=n;j++) bestx[j]=x[j];bestw=cw;}
return;}
r-=w[i];
if(cw+w[i]=c){
x[i]=1;
cw+=w[i];
Backtrack(i+1);
cw-=w[i];}
if(cw+rbestw){
x[i]=0;
Backtrack(i+1);}
r+=w[i]; }
templateclass Type
Type MaxLoading(Type w[],Type c,int n,int bestx[])
{ LoadingTypeX;
X.x=new int[n+1];
X.w=w;
X.c=c;
X.n=n;
X.bestx=bestx;
X.bestw=0;
X.cw=0;
X.r=0;
for(int i=1;i=n;i++)
X.r+=w[i];
X.Backtrack(1);
delete [] X.x;
cout所取物品:;
for(i=1;i=n;i++)
coutbestx[i] ;
return X.bestw;
}
void main()
{ int w[100],c,n,bestx[6];
cout输入物品个数(小于100):;
cinn;
cout输入n个物品重量:;
for(int i=1;in+1;i++)
cinw[i];
cout输入第一艘轮船的载重量:;
cinc;
coutendl最大装载重量为:MaxLoading(w,c,n,bestx)endl;
}
2. 图的m着色问题的程序代码如下:
#include iostream
using namespace std;
int sum;
// 判断对顶点k着色以后是否合法着色
bool ok(int x[], int k, bool c[5][5], int n)
{ int i;
for(i = 0; i k; i++)
if((c[k][i] x[k] == x[i])) // 第k个顶点与某个相邻的顶点有颜色冲突
return false;
return true; // 合法
}
// 输入n为顶点个数,颜色数m,图的邻接矩阵c[][]
// 输出n个顶点的着色x[]
void m_coloring(int n, int m, int x[], bool c[5][5])
{ int i, k;
// 一开始各个顶点无颜色
for(i = 0; i n; i++)
x[i] = 0;
k = 0; // 从第0个顶点开始着色
while(k = 0)
{ x[k]++;
while((x[k] = m) (!ok(x, k, c, n))) // 得到最高标值的颜色
x[k]++;
if(x[k] = m) // 第k个顶点的染色是合法的
{ if(k == n - 1) // 所有的顶点都已经染完色,程序退出
{ sum++;
printf(\n第中%d方案:,sum);
原创力文档

文档评论(0)