试基于图的深度优先搜索算法实现一个算法:判断以邻接表方式存储的有向图中是否存在由顶点A到顶点B的路径C语言
时间: 2024-02-17 19:02:05 浏览: 58
采用连接表存储有向图,设计算法判断任意两个顶点间是否存在路径.doc
以下是基于邻接表的深度优先搜索算法实现,用于判断有向图中是否存在从顶点A到顶点B的路径:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 20 // 最大顶点数
// 定义邻接表节点结构体
typedef struct ArcNode {
int adjvex; // 该边所指向的顶点的位置
struct ArcNode *next; // 指向下一条边的指针
} ArcNode;
// 定义顶点信息结构体
typedef struct {
char data; // 顶点数据
ArcNode *firstarc; // 指向第一个依附该顶点的边的指针
} VNode;
// 定义邻接表结构体
typedef struct {
VNode vertices[MAX_VERTEX_NUM]; // 存放顶点信息的数组
int vexnum, arcnum; // 顶点数和边数
} ALGraph;
// 初始化邻接表
void InitALGraph(ALGraph *G) {
int i;
G->vexnum = 0;
G->arcnum = 0;
for (i = 0; i < MAX_VERTEX_NUM; i++) {
G->vertices[i].firstarc = NULL;
}
}
// 添加边
void AddArc(ALGraph *G, int start, int end) {
ArcNode *p = (ArcNode *)malloc(sizeof(ArcNode));
p->adjvex = end;
p->next = G->vertices[start].firstarc;
G->vertices[start].firstarc = p;
G->arcnum++;
}
// 深度优先搜索
int DFS(ALGraph *G, int v, int target, int *visited) {
ArcNode *p;
visited[v] = 1; // 标记该顶点已被访问
if (v == target) { // 如果找到目标顶点,则返回1
return 1;
}
for (p = G->vertices[v].firstarc; p; p = p->next) { // 遍历该顶点的所有邻接点
if (!visited[p->adjvex]) { // 如果该邻接点未被访问,则继续递归搜索
if (DFS(G, p->adjvex, target, visited)) {
return 1;
}
}
}
return 0;
}
// 判断是否存在从顶点A到顶点B的路径
int IsPathExist(ALGraph *G, char A, char B) {
int i, start = -1, end = -1;
int visited[MAX_VERTEX_NUM];
for (i = 0; i < G->vexnum; i++) { // 遍历邻接表,找到顶点A和顶点B的位置
if (G->vertices[i].data == A) {
start = i;
}
if (G->vertices[i].data == B) {
end = i;
}
}
if (start == -1 || end == -1) { // 如果未找到顶点A或顶点B,则不存在路径
return 0;
}
for (i = 0; i < G->vexnum; i++) { // 初始化visited数组
visited[i] = 0;
}
return DFS(G, start, end, visited); // 调用DFS函数进行搜索
}
// 测试代码
int main() {
ALGraph G;
InitALGraph(&G);
AddArc(&G, 0, 1);
AddArc(&G, 0, 2);
AddArc(&G, 1, 2);
AddArc(&G, 2, 0);
AddArc(&G, 2, 3);
AddArc(&G, 3, 3);
if (IsPathExist(&G, 'A', 'D')) {
printf("存在从顶点A到顶点D的路径\n");
} else {
printf("不存在从顶点A到顶点D的路径\n");
}
if (IsPathExist(&G, 'A', 'E')) {
printf("存在从顶点A到顶点E的路径\n");
} else {
printf("不存在从顶点A到顶点E的路径\n");
}
return 0;
}
```
上述代码中,我们定义了一个邻接表结构体`ALGraph`,其中`vertices`数组存放顶点信息,`vexnum`表示顶点数,`arcnum`表示边数。我们用`AddArc`函数向邻接表中添加边,用`DFS`函数进行深度优先搜索,用`IsPathExist`函数判断是否存在从顶点A到顶点B的路径。在测试代码中,我们添加了一些边,并且分别判断了从顶点A到顶点D以及从顶点A到顶点E是否存在路径。
阅读全文