用C语言基于图的深度优先搜索策略写一算法,判别以邻接表方式存储的有向图中是否存在由顶点vi到顶点vj的路径(i ≠j) 。注意:算法中涉及的图的基本操作必须在此存储结构上实现。
时间: 2024-02-24 11:53:43 浏览: 63
采用连接表存储有向图,设计算法判断任意两个顶点间是否存在路径.doc
好的,我会尽力回答你的问题。基于邻接表方式存储的有向图,我们可以用深度优先搜索算法来判断是否存在由顶点vi到顶点vj的路径。具体的算法实现如下:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100 // 图中最大顶点数
// 邻接表中的边节点
typedef struct ArcNode {
int adjvex; // 该边所指向的顶点的位置
struct ArcNode *nextarc; // 指向下一条边的指针
} ArcNode;
// 邻接表中的顶点节点
typedef struct VNode {
int data; // 顶点的数据
ArcNode *firstarc; // 指向第一条依附该顶点的边的指针
} VNode, AdjList[MAX_VERTEX_NUM];
// 有向图的邻接表结构
typedef struct {
AdjList vertices; // 邻接表
int vexnum, arcnum; // 图的顶点数和边数
} ALGraph;
// 初始化有向图
void InitGraph(ALGraph *G) {
int i;
G->vexnum = G->arcnum = 0;
for (i = 0; i < MAX_VERTEX_NUM; i++) {
G->vertices[i].data = 0;
G->vertices[i].firstarc = NULL;
}
}
// 添加顶点
void AddVertex(ALGraph *G, int v) {
G->vertices[G->vexnum].data = v;
G->vexnum++;
}
// 添加边
void AddArc(ALGraph *G, int from, int to) {
ArcNode *arc = (ArcNode *) malloc(sizeof(ArcNode));
arc->adjvex = to;
arc->nextarc = G->vertices[from].firstarc;
G->vertices[from].firstarc = arc;
G->arcnum++;
}
// 深度优先搜索
void DFS(ALGraph *G, int i, int j, int *visited, int *found) {
visited[i] = 1; // 标记该顶点已访问过
if (i == j) { // 找到了从vi到vj的路径
*found = 1;
return;
}
ArcNode *arc = G->vertices[i].firstarc;
while (arc != NULL && !*found) {
if (!visited[arc->adjvex]) { // 如果该顶点未被访问过
DFS(G, arc->adjvex, j, visited, found); // 继续搜索
}
arc = arc->nextarc;
}
}
// 判断有向图中是否存在由顶点vi到顶点vj的路径
int HasPath(ALGraph *G, int i, int j) {
int found = 0;
int visited[MAX_VERTEX_NUM] = {0}; // 初始化所有顶点为未访问过
DFS(G, i, j, visited, &found); // 从vi开始搜索
return found;
}
int main() {
int i, n, m, v, w;
ALGraph G;
InitGraph(&G);
printf("请输入顶点数和边数:");
scanf("%d%d", &n, &m);
printf("请输入%d个顶点:\n", n);
for (i = 0; i < n; i++) {
scanf("%d", &v);
AddVertex(&G, v);
}
printf("请输入%d条边:\n", m);
for (i = 0; i < m; i++) {
scanf("%d%d", &v, &w);
AddArc(&G, v, w);
}
printf("请输入要查询的路径(格式:i j):");
scanf("%d%d", &v, &w);
if (HasPath(&G, v, w)) {
printf("存在从顶点%d到顶点%d的路径。\n", v, w);
} else {
printf("不存在从顶点%d到顶点%d的路径。\n", v, w);
}
return 0;
}
```
以上就是基于图的深度优先搜索策略写一算法,判别以邻接表方式存储的有向图中是否存在由顶点vi到顶点vj的路径(i ≠j)的实现方法。
阅读全文