求任意两个结点之间的路径(通过DFS算法,递归实现)

目录

实现思路

代码实现部分

测试样例

实现思路

建立图后,采用DFS算法深度探索 通过递归 初始结点到目的结点的路径

与DFS遍历图不同的是

1.使用了Path数组记录初始结点到目的结点的路径

2.d用来记录路径个数,控制输出

3.当当前结点等于目标结点时,输出路径

代码实现部分

#define  MAXV  51
#include <iostream>
#include <stack>
using namespace std;
typedef struct ANode {
	int adjvex;            //该边的终点编号
	struct ANode *nextarc;    //指向下一条边的指针
	int info;    //该边的相关信息,如权重
} ArcNode;                //边表节点类型
typedef int Vertex;
typedef struct Vnode {
	Vertex data;            //顶点信息
	ArcNode *firstarc;        //指向第一条边
} VNode;                //邻接表头节点类型
typedef VNode AdjList[MAXV];
typedef struct {
	AdjList adjlist;        //邻接表
	int n, e;       //图中顶点数n和边数e
} AdjGraph;
int visited[MAXV];
int t=1;
void CreateAdj(AdjGraph *&G, int n, int e); //创建图邻接表  有向图
void DFS(AdjGraph *G, int v, int goat,int path[], int d);//DFS探索
int main() {
	AdjGraph *G;
	int n, e, i, v, goat;
	cin >> n >> e;
	CreateAdj(G, n, e);
	cin >> v >> goat;
	for (i = 1; i <= G->n; i++) visited[i] = 0;//初始化
	int path[MAXV];
	DFS(G, v, goat,path,0);
	if(t==1)
		cout<<"No Find!";
	return 0;
}
void CreateAdj(AdjGraph *&G, int n, int e) {
	G = new AdjGraph;
	G->n = n;
	G->e = e;
	for (int i = 1; i <= n; i++) {
		G->adjlist[i].data = i;
		G->adjlist[i].firstarc = NULL;
	}
	for (int j = 1; j <= e; j++) {
		int u, v;
		cin >> u >> v;
		ArcNode *p = new ArcNode;
		p->adjvex = v;
		p->nextarc = G->adjlist[u].firstarc;
		G->adjlist[u].firstarc = p;
	}
} //创建图邻接表
void DFS(AdjGraph *G, int v, int goat,int path[], int d) 
{
	visited[v]=1;//标记访问
	path[++d]=v;
	if(v==goat){
		cout<<"Path "<<t++<<": ";
		for(int i=1;i<=d;i++)
		{
			cout<<path[i]<<" ";
		}
		cout<<endl;
	}
	ArcNode *p=G->adjlist[v].firstarc;
	while(p){
		if(visited[p->adjvex]==0)
			DFS(G,p->adjvex,goat,path,d);
		p=p->nextarc;
	}
	visited[v]=0;//避免重复
}

测试样例

  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值