C语言试写一算法,判断以邻接表方式存储的有向图中是否存在由顶点Vi到顶点Vj的路径(i-->j)。 【输入形式】 顶点个数:n 边的条数:m 边的有向顶点对: (a,b)…… 待判断定点i,j
时间: 2024-05-16 10:16:17 浏览: 99
以下是一个简单的 C 语言算法实现,可以判断有向图中是否存在从顶点 i 到顶点 j 的路径。
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100 // 最大顶点数
// 邻接表中表示边的结构体
typedef struct ArcNode {
int adjvex; // 邻接点在表头数组中的位置
struct ArcNode *next; // 指向下一个邻接点的指针
} ArcNode;
// 邻接表中表示顶点的结构体
typedef struct VNode {
int data; // 顶点信息
ArcNode *first; // 指向第一个邻接点的指针
} VNode, AdjList[MAX_VERTEX_NUM];
// 有向图的结构体,包含顶点数、边数以及邻接表
typedef struct {
AdjList vertices; // 邻接表
int vexnum, arcnum; // 顶点数和边数
} Graph;
// 初始化邻接表中表示顶点的结构体
void InitVNode(VNode *v, int data) {
v->data = data;
v->first = NULL;
}
// 添加一条边到邻接表中
void AddEdge(Graph *G, int u, int v) {
ArcNode *p = (ArcNode *)malloc(sizeof(ArcNode));
p->adjvex = v;
p->next = G->vertices[u].first;
G->vertices[u].first = p;
}
// 判断从顶点 i 到顶点 j 是否存在路径
int HasPath(Graph *G, int i, int j) {
int visited[MAX_VERTEX_NUM] = {0};
ArcNode *p;
if (i == j) {
return 1;
}
visited[i] = 1;
for (p = G->vertices[i].first; p != NULL; p = p->next) {
if (!visited[p->adjvex] && HasPath(G, p->adjvex, j)) {
return 1;
}
}
return 0;
}
int main() {
Graph G;
int n, m, i, u, v, i_idx, j_idx;
// 读入顶点数和边数
scanf("%d %d", &n, &m);
// 初始化邻接表
for (i = 0; i < n; i++) {
InitVNode(&G.vertices[i], i);
}
// 读入边的信息并添加到邻接表中
for (i = 0; i < m; i++) {
scanf("%d %d", &u, &v);
AddEdge(&G, u, v);
}
// 读入待判断的顶点 i 和 j
scanf("%d %d", &i_idx, &j_idx);
// 判断是否存在从 i 到 j 的路径
if (HasPath(&G, i_idx, j_idx)) {
printf("存在从顶点 %d 到顶点 %d 的路径\n", i_idx, j_idx);
} else {
printf("不存在从顶点 %d 到顶点 %d 的路径\n", i_idx, j_idx);
}
return 0;
}
```
其中,`Graph` 结构体表示有向图,包含了顶点数、边数以及邻接表。在邻接表中,每个顶点使用一个 `VNode` 结构体来表示,它包含了该顶点的信息和一个指向第一个邻接点的指针。每个邻接点使用一个 `ArcNode` 结构体来表示,它包含了邻接点在表头数组中的位置以及一个指向下一个邻接点的指针。
添加边到邻接表中的函数 `AddEdge` 依次从表头数组 `G->vertices` 中找到起点 `u` 对应的顶点,并将边添加到它的邻接表中。
判断是否存在从顶点 i 到顶点 j 的路径的函数 `HasPath` 使用了深度优先搜索(DFS)算法。首先将起点 i 标记为已访问,然后对 i 的所有邻接点递归地调用 `HasPath` 函数,如果其中有一个邻接点是 j,或者从其中一个邻接点出发可以到达 j,那么就说明存在从 i 到 j 的路径。
最后,在 `main` 函数中,读入顶点数、边数和边的信息,并将它们添加到邻接表中。然后读入待判断的顶点 i 和 j,调用 `HasPath` 函数判断是否存在从 i 到 j 的路径,并输出结果。
阅读全文