借鉴了这篇文章https://blog.csdn.net/h471507602/article/details/80452342,感谢!
但是改了节点个数会报错,于是自己打了一个,应该是没错的,本来想好好写一下的,写的又不像C语言又不像C++。。
但是要是修改的话很容易的,自己改吧。
#include<iostream> #include<vector> #define SUM_NODE 6 // 节点个数 using namespace std; vector<vector<int> > all_pathway;//保存所有路径 vector<int> a_pathway;//保存一条路径 int matrix[SUM_NODE][SUM_NODE];//邻接矩阵 int visited[SUM_NODE];//是否访问 int sum = 1; void init() //矩阵初始化 想要改矩阵在这里 { for(int i=0;i<SUM_NODE;i++) { for(int j=0;j<SUM_NODE;j++) { if(i==j) { matrix[i][j]=0; } else { matrix[i][j]=1; } } } } void output() { cout << "第" << sum << "条路径: "; for(int i=0;i<a_pathway.size();i++) { cout<<a_pathway.at(i)<<" "; } cout<<endl; sum++; } void DFS(int a[SUM_NODE][SUM_NODE],int start,int end) //深搜遍历 { a_pathway.push_back(start);//将当前节点入栈 visited[start]=true;//标记为已经访问过 int middle=0;//一个索引,用来找到下一个节点 while(a_pathway.empty()==false)//如果栈空则结束 { if(start==end)//如果当前节点就是目标节点 { output(); //输出这条路径 all_pathway.push_back(a_pathway);//保存一条路径 a_pathway.pop_back();//退栈,回溯 visited[start]=false;//设置为没有被访问过 break; //退出一个递归 } while(middle<SUM_NODE)//如果没有到最后一个邻居 { if(matrix[start][middle]==1&&visited[middle]==false)//如果与邻居相通且这个邻居节点未被的访问过 { DFS(matrix,middle,end); //递归查询 } middle++; //一个一个向后寻找相通的邻居节点 } if(middle==SUM_NODE) //找到最后一个了 { visited[a_pathway.at(a_pathway.size()-1)] = false;//先标记栈中最后一个元素为没有访问过 a_pathway.pop_back();//退栈,回溯 break; //退出一个递归 } } } int main() { init(); DFS(matrix,0,5);//起点和终点 return 0; }
