
/* 输出顶点vi到顶点vj的所有简单路径,图用邻接表存储 分析: 这里明说了输出路径,所以肯定存在简单路径。为了输出路径,我们还需要额外添加一个path数组, 用来存储vi到vj的路径数据,方便我们之后打印输出。我们这里仍然采用深度优先遍历,广度优先遍历不适合。*/#define _CRT_SECURE_NO_WARNINGS#define MAXSIZE 100#include <stdio.h>#include <stdlib.h>typedef struct EdgeNode {//边表结点 int index;//该边所指向的顶点的位置 int weight;//权值 EdgeNode *next;//下一个邻接边}EdgeNode;typedef struct VertexNode {//顶点表节点 char info;//顶点信息 EdgeNode *firstEdge;//指向第一条依附该顶点的边的指针}VertexNode, Adjlist[MAXSIZE];typedef struct { Adjlist adjlist;//顶点数组 int numE, numV;//边数、顶点数}ALGraph;void print(ALGraph *G, int *path, int vi,int d) { for (int i = 0; i <= d; i++) printf("%c ", G->adjlist[path[i]].info); printf("\n");}void findRoute(ALGraph *G, int vi, int vj, int *path, int *visited, int d) { EdgeNode *p; d++; path[d] = vi; visited[vi] = 1; if (vi == vj) { print(G, path, vi,d); } for (p = G->adjlist[vi].firstEdge; p;p=p->next) { if (!visited[p->index]) { findRoute(G,p->index,vj,path,visited,d); } } visited[vi] = 0;//重新置位可访问}int main() { void createGraphInFile(ALGraph *G); ALGraph *G = (ALGraph *)malloc(sizeof(ALGraph *)); void dispGraph(ALGraph *); createGraphInFile(G);//创建图 int vi, vj; printf("请输入vi,vj\n"); printf("vi= "); scanf("%d", &vi); printf("vj= "); scanf("%d", &vj); while (vi > G->numV || vj > G->numV) { printf("输入有误,不存在该顶点,请重新输入!"); printf("vi= "); scanf("%d", &vi); printf("vj= "); scanf("%d", &vj); } int *visited = (int *)malloc(sizeof(int)*G->numV); int *path = (int *)malloc(sizeof(int)*G->numV); for (int i = 0; i < G->numV; i++) { visited[i] = 0;//初始化 path[i] = -1;//初始化 } dispGraph(G); findRoute(G, vi - 1, vj - 1, path, visited, -1); return 0;}