DFS算法遍历任意两点之间的所有路径并输出Word格式.docx
《DFS算法遍历任意两点之间的所有路径并输出Word格式.docx》由会员分享,可在线阅读,更多相关《DFS算法遍历任意两点之间的所有路径并输出Word格式.docx(12页珍藏版)》请在冰豆网上搜索。
inttemp=-1;
for(inti=0;
i<
L;
i++)
{
path->
setPos(i);
getValue(temp);
cout<
<
temp;
if(i!
=L-1)
cout<
"
>
;
}
cout<
endl;
}
voidDFS(Graph*G,intv,intend,AList<
*path){
G->
setMark(v,VISITED);
//标记为已访问,防止路径重复
path->
append(v);
//记录节点
if(v==end)//到达终点
//在这里对路径进行处理
PrintPath(path);
//打印整条路径
else//否则
for(intw=G->
first(v);
w<
G->
n();
w=G->
next(v,w))//继续寻找下一个未访问的点
if(G->
getMark(w)==UNVISITED)
DFS(G,w,end,path);
//把找到的未访问节点w作为起点,进入递归
//重点:
没有未访问邻居节点(陷入了死路)或者到达终点,后退找新的未访问路径
G->
setMark(v,UNVISITED);
//回溯标记为未访问
//从path中移除V
path->
setEnd();
remove();
intmain(intargc,char*argv[])
{
intmapTemp[8][8]={
{0,1,1,0,0,0,0,0},//0
{1,0,0,1,1,0,0,0},//1
{1,0,0,1,0,1,0,0},//2
{0,1,1,0,1,1,0,0},//3
{0,1,0,1,0,0,1,1},//4
{0,0,1,1,0,0,1,0},//5
{0,0,0,0,1,1,0,0},//6
{0,0,0,0,1,0,0,0}//7
};
//7
///
//1--4
///\/\
//036
//\/\/
//2--5
//
//初始化
Graphm*map=newGraphm(8);
8;
for(intj=0;
j<
j++)
map->
setEdge(i,j,mapTemp[i][j]);
//setedge(v1,v2)towgt
setAllMark(UNVISITED);
AList<
*path=newAList<
ints=1;
//起点
inte=7;
//终点
//开始遍历
DFS(map,s,e,path);
return0;
/**********************************************************************/
//图的抽象类
//Graph.h
classGraph{
public:
virtualn()=0;
virtuale()=0;
virtualintfirst(int)=0;
virtualintnext(int,int)=0;
virtualvoidsetEdge(int,int,int)=0;
virtualvoiddelEdge(int,int)=0;
virtualintweight(int,int)=0;
virtualintgetMark(int)=0;
virtualvoidsetMark(int,int)=0;
virtualvoidsetAllMark(int)=0;
//自己添加的
};
//图的实现
//Graphm.h
#defineUNVISITED0
#defineVISITED1
classGraphm:
publicGraph{//Implementadjacencymnatrix
private:
intnumVertex,numEdge;
int**matrix;
//Pointertoadjacencymatrix
int*mark;
//Pointertomarkarray
Graphm(intnumVert){//Markgraphw/numVertvertices
inti,j;
numVertex=numVert;
numEdge=0;
mark=newint[numVert];
//Initializemarkarray
for(i=0;
numVertex;
mark[i]=UNVISITED;
matrix=(int**)newint*[numVertex];
//Markmatrix
matrix[i]=newint[numVertex];
//Edgesstartw/0weight
for(j=0;
matrix[i][j]=0;
~Graphm(){//Destructor
delete[]mark;
//Returndynameicallyallocatedmemory
for(inti=0;
delete[]matrix[i];
delete[]matrix;
intn(){returnnumVertex;
}//Numberofvertices
inte(){returnnumEdge;
}//Numberofedges
intfirst(intv){//Returnv'
sfirstneighbor
inti;
if(matrix[v][i]!
=0)returni;
returni;
//Returnnifnone
intnext(intv1,intv2){//Getv1'
sneighborafterv2
for(i=v2+1;
if(matrix[v1][i]!
//setedge(v1,v2)towgt
voidsetEdge(intv1,intv2,intwgt){
assert(wgt>
=0);
if(matrix[v1][v2]==0)numEdge++;
matrix[v1][v2]=wgt;
voiddelEdge(intv1,intv2){
if(matrix[v1][v2]!
=0)numEdge--;
matrix[v1][v2]=0;
intweight(intv1,intv2){returnmatrix[v1][v2];
intgetMark(intv){returnmark[v];
voidsetMark(intv,intval){mark[v]=val;
voidsetAllMark(intval){
mark[i]=val;
//用到的Alist
//AList.h
#ifndef_ALIST_H
#define_ALIST_H
#ifndefNULL
constintNULL=0;
#endif//NULL
template<
classElem>
classAList{
intmaxSize;
intlistSize;
intfence;
Elem*listArray;
voidcapacityExpansion()
Elem*temp=newElem[maxSize*=2];
intn=listSize;
Elem*destprt=temp;
Elem*srcprt=listArray;
while(n--)
*destprt++=*srcprt++;
delete[]listArray;
listArray=temp;
AList(intsz=50){
maxSize=sz;
listSize=fence=0;
listArray=newElem[maxSize];
AList(AList&
item){
maxSize=item.maxSize;
listSize=item.listSize;
fence=item.fence;
Elem*destprt=listArray;
Elem*srcoprt=item.listArray;
~AList(){
delete[]listArray;
voidclear(){//清除数组里的内容(maxSize->
50)
listArray=newElem[50];
voidinsert(Elem&
item){//在fence位置插入元素
if(listSiz