无向图输出两个节点之间的所有路径

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

 

  • 8
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值