DFS算法:遍历任意两点之间的所有路径并输出
代码大部分都是从数据结构书上来的,水平有限仅供参考!希望对课程设计要用到这个算法的同学有帮助
先看运行结果: 起点1,终点7
基本代码都是从数据结构书上抄来的,重点看红字。
全部源代码
//mian的实现
#include \"stdafx.h\" #include \"iostream\" #include \"assert.h\" #include \"graph.h\" #include \"Graphm.h\" #include \"AList.h\" using namespace std;
void PrintPath(AList if(v==end) //到达终点 //在这里对路径进行处理 PrintPath(path); //打印整条路径 else //否则 for(int w=G->first(v);w //重点:没有未访问邻居节点(陷入了死路)或者到达终点,后退找新的未访问路径 G->setMark(v,UNVISITED); //回溯 标记为未访问 //从path中移除V path->setEnd(); path->remove(); } int main(int argc, char* argv[]) { int mapTemp[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 // /\\ /\\ // 0 3 6 // \\/ \\ / // 2--5 // //初始化 Graphm *map=new Graphm(8); for(int i=0;i<8;i++) for(int j=0;j<8;j++) map->setEdge(i,j,mapTemp[i][j]);//set edge(v1,v2)to wgt map->setAllMark(UNVISITED); AList DFS(map,s,e,path); return 0; } /**********************************************************************/ //图的抽象类 //Graph.h class Graph{ public: virtual n()=0; virtual e()=0; virtual int first(int)=0; virtual int next(int,int)=0; virtual void setEdge(int,int,int)=0; virtual void delEdge(int,int)=0; virtual int weight(int,int)=0; virtual int getMark(int)=0; virtual void setMark(int,int)=0; virtual void setAllMark(int)=0; //自己添加的 }; /**********************************************************************/ //图的实现 //Graphm.h #define UNVISITED 0 #define VISITED 1 class Graphm:public Graph{ //Implement adjacency mnatrix private: int numVertex,numEdge; int **matrix; //Pointer to adjacency matrix int *mark; //Pointer to mark array public: Graphm(int numVert){ //Mark graph w/numVert vertices int i,j; numVertex=numVert; numEdge=0; mark=new int[numVert]; //Initialize mark array for(i=0;i //AList.h #ifndef _ALIST_H #define _ALIST_H #ifndef NULL const int NULL=0; #endif //NULL template int fence; Elem* listArray; void capacityExpansion() { Elem* temp=new Elem[maxSize*=2]; int n=listSize; Elem* destprt=temp; Elem* srcprt=listArray; while(n--) *destprt++=*srcprt++; delete[] listArray; listArray=temp; } public: AList(int sz=50){ maxSize=sz; listSize=fence=0; listArray=new Elem[maxSize]; } AList(AList &item){ maxSize=item.maxSize; listSize=item.listSize; fence=item.fence; listArray=new Elem[maxSize]; int n=listSize; Elem* destprt=listArray; Elem* srcoprt=item.listArray; while(n--) *destprt++=*srcprt++; } ~AList(){ delete []listArray; } void clear(){ //清除数组里的内容(maxSize->50) delete []listArray; listArray=new Elem[50]; listSize=fence=0; } void insert(Elem& item){ //在fence位置插入元素 if(listSize==maxSize) capacityExpansion(); int n=rightLength(),i=listSize++; while(n--) listArray[i--]=listArray[i-1]; listArray[fence]=item; } void append(Elem& item){ //在数组末尾插入元素 if(listSize==maxSize) capacityExpansion(); listArray[listSize++]=item; } void remove(Elem& item){ //删除fence位置的元素,通过引用返回被删元素 item=listArray[fence]; Elem* temp=new Elem[maxSize]; for(int i=0,j=0;i }; #endif //_ALIST_H 因篇幅问题不能全部显示,请点此查看更多更全内容