目录
实现思路
建立图后,采用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;//避免重复
}