借鉴了这篇文章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;
}