分类: C/C++
2006-10-25 12:58:30
// ExamSaleMan.cpp : 定义控制台应用程序的入口点。
* 问题:货郎担问题 实现方法:枚举,回溯,动态规划,分支界限法 *
* 联系:guojie_flying@yahoo.com.cn *
* 工作平台: WinXP,ViaualC++.net *
目录结构 :有一个基类SalesMan,放置基本数据和操作,然后从salesman继承了4个类,是四种方法的实现,分别是EnumSalesMan,DySalesMan,TrackBakSalesMan,BoundSalesMan,对应的头文件EnumSalesMan。h,DySalesMan.h,TrackBakSalesMan.h,BoundSalesMan.h; Node.h为用到的struct节点
int _tmain(int argc, _TCHAR* argv[])
/* 文件名:SalesMan。H 货郎担基类头文件 */
enum{MAXNUM=999}; //最大值设为无穷大
vector
int minValue;//最小路径长度
virtual ~SalesMan(){matrix.clear();path.clear();}
void PrintMatrix(); //打印矩阵值
void PrintPath(); //打印路径
/* 文件名:SalesMan。Cpp 货郎担基类源文件 */
SalesMan::SalesMan() //构造函数,从文件中读取数值,生成图的邻接矩阵,
cerr<<"file open
failed!"< vector int
num; for (unsigned int
i=0;i cout< /*
文件名:EnumSalesMan.h 枚举法 */ public
SalesMan int
Cost(vector void
Enumerate(vector void
Travel(); /* 文件名:EnumSalesMan.cpp
枚举法 */ vector for (unsigned int
i=0;i int EnumSalesMan::Cost(vector int
sum=matrix[0][A[0]];//先求从0到第一个点的距离 for (unsigned int
i=1;i if
(i==A.size()-1) if
(minValue>Cost(A)) int
tmp=A[i];A[i]=A[k];A[k]=tmp; public
SalesMan int g(int i,vector int j(int i,vector void
Travel(); int DySalesMan::j(int
i,vector for (unsigned int
j=0;j return
i; int
min=MAXNUM;//不妨定义一个最大值作为初始 int
cost,node; for (unsigned int
j=0;j if
(bv[j]==true)// if
(min>cost) return
node; int DySalesMan::g(int
i,vector for (unsigned int
j=0;j return
matrix[i][0]; int
min=MAXNUM;//不妨定义一个最大值作为初始 int
cost,node; for (unsigned int
j=0;j if
(bv[j]==true)// if
(min>cost) vector vector for (unsigned int
i=0;i int
min=999; for (unsigned int
i=1;i if
(min>cost) if
(min>=MAXNUM) int
nextNode; while
(node!=nextNode) cout<<"dynamic
minValue:"< /* 文件名:TrackSalesMan.h
回溯法 */ public
SalesMan vector void
TrackBack(int k,int sum); void
Travel(); /* 文件名:TrackSalesMan.cpp
回溯法 */ void TrackBackSalesMan::TrackBack(int
k,int
sum) if
(tmpPath.size()>1)
sum+=matrix[0][k]; if
(sum>minValue) //界限函数,如果在某一点已经超过当前最小值,则返回 if
(tmpPath.size()==matrix.size()-1) if
(sum if
(i==tmpPath[j])//看是否i与path中有相同的点 if
(j==tmpPath.size())//没有相同的点, cout<<"TrackBack
minValue:"< /*
文件名:Node.h 为BoundSalesMan所调用,结点数据结构 */ int
position; //当前结点 vector Node(int n,int l,int
position,vector bool operator< (const
Node & B)const /*
文件名:Node.cpp 为BoundSalesMan所调用,结点数据结构的实现 */ Node::Node(int n,int l,int pos,vector num=n;
level=l; position=pos;
states=path; m=mValue; /*
文件名:BoundleSalesMan.h
限界函数法 */ public
SalesMan int
SetIMatrix(int i,int
k,vector int
Cost(vector int
SimMatrix(vector< vector void
Travel(); /* 文件名:BoundleSalesMan.cpp
限界函数法 */ int
result=0; bool
boolMax,boolZone; boolMax=boolMax &&
(m[i][j]==MAXNUM); //所有都是无穷大 boolZone=boolZone || (m[i][j]==0)
; //是否有一个是0 if
((boolMax) || (boolZone)) int
min=m[i][0]; for
(int k=1;k<=col;k++) if
(min>m[i][k]) for
(int k=0;k<=col;k++) if
(m[i][k]!=MAXNUM) //如果是无穷值,则不变 boolMax=boolMax &&
(m[j][i]==MAXNUM); //所有都是无穷大 boolZone=boolZone || (m[j][i]==0)
; //是否有一个是0 if
((boolMax) || (boolZone)) int
min=m[0][i]; for
(int k=1;k<=col;k++) if
(min>m[k][i]) for
(int k=0;k<=col;k++) if
(m[k][i]!=MAXNUM) //如果是无穷值,则不变 return
result; int
BoundSalesMan::SetIMatrix(int i,int k,vector int
cols=im.size()-1; int BoundSalesMan::Cost(vector int
i=A.size(); int
sum=matrix[0][A[0]];//先求从0到第一个点的距离 for (unsigned int
i=1;i int
n0=SimMatrix(simpleM); int
cols=matrix.size()-1; while (!
p.empty() && p.top().level for
(int j=0;j if
(i==node.states[j]) //路径里有这个点了 if
(j int
tmp=node.num; tmp+=SetIMatrix(i,node.position
,simpleM); //对第i点的矩阵进行处理 vector cout<<"Bound
MinValue:"< //
stdafx.h : 标准系统包含文件的包含文件, //
或是常用但不常更改的项目特定的包含文件 999
20 30
10 11 15 999 16
4 2 3 5
999 2 4 19 6
18 999 3 16 4
7 16 999 对应结果: 999
10 15
20 5 999
9 10 6 13
999 12 8 8
9 999 对应结果: chinaunix网友2008-08-18 13:08:54 我把它原样放到C++中,为什么说我Cannot open include file: 'stdafx.h': No such file or directory出错啊。。。郁闷,不会啊。。。