写一c语言算法基于图的广度优先搜索策略,判别以邻接表方式存储的有向图中是否存在由顶点Vj 到顶点Vi 的路径,要求代码尽量简洁明了
时间: 2024-01-21 21:17:41 浏览: 83
C++实现图的邻接表存储和广度优先遍历实例分析
以下是基于图的广度优先搜索策略的C语言代码,用于判断以邻接表方式存储的有向图中是否存在由顶点Vj 到顶点Vi 的路径:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100 // 最大顶点数
// 邻接表中的边结构体
typedef struct EdgeNode {
int adjvex; // 邻接点的位置
struct EdgeNode* next; // 指向下一个邻接点的指针
} EdgeNode;
// 邻接表中的顶点结构体
typedef struct VertexNode {
int data; // 顶点数据
EdgeNode* firstedge; // 指向第一个邻接点的指针
} VertexNode, AdjList[MAX_VERTEX_NUM];
// 邻接表结构体
typedef struct {
AdjList vertices; // 顶点数组
int vexnum, arcnum; // 顶点数和边数
} ALGraph;
// 初始化邻接表
void Init(ALGraph* G, int vexnum) {
G->vexnum = vexnum;
G->arcnum = 0;
for (int i = 0; i < G->vexnum; i++) {
G->vertices[i].data = i; // 顶点数据为下标
G->vertices[i].firstedge = NULL; // 初始化邻接表为空
}
}
// 添加边
void AddEdge(ALGraph* G, int u, int v) {
EdgeNode* e = (EdgeNode*)malloc(sizeof(EdgeNode)); // 创建新边结点
e->adjvex = v;
e->next = G->vertices[u].firstedge; // 将e插入到顶点u的邻接表头部
G->vertices[u].firstedge = e;
G->arcnum++;
}
// 广度优先搜索
int BFS(ALGraph* G, int start, int end) {
int visited[MAX_VERTEX_NUM] = {0}; // 初始化所有顶点为未访问
int queue[MAX_VERTEX_NUM]; // 创建队列用于广度优先搜索
int front = 0, rear = 0; // 队列头指针和尾指针
queue[rear++] = start; // 将start加入队列
visited[start] = 1; // 标记start已访问
while (front < rear) { // 队列非空
int v = queue[front++]; // 出队一个顶点v
EdgeNode* p = G->vertices[v].firstedge; // 找到v的第一个邻接点
while (p) { // 遍历v的所有邻接点
if (!visited[p->adjvex]) { // 如果该邻接点未被访问
if (p->adjvex == end) return 1; // 如果找到了end,则返回1
visited[p->adjvex] = 1; // 标记该邻接点已访问
queue[rear++] = p->adjvex; // 将该邻接点入队
}
p = p->next; // 指向下一个邻接点
}
}
return 0; // 没有找到end,返回0
}
int main() {
ALGraph G;
int vexnum, arcnum;
printf("请输入顶点数和边数:");
scanf("%d%d", &vexnum, &arcnum);
Init(&G, vexnum);
printf("请输入每条边的起点和终点:\n");
for (int i = 1; i <= arcnum; i++) {
int u, v;
scanf("%d%d", &u, &v);
AddEdge(&G, u, v);
}
int start, end;
printf("请输入要查询的起点和终点:");
scanf("%d%d", &start, &end);
if (BFS(&G, start, end)) printf("存在从%d到%d的路径\n", start, end);
else printf("不存在从%d到%d的路径\n", start, end);
return 0;
}
```
在该算法中,我们首先定义了邻接表中的边结构体和顶点结构体。然后定义了邻接表结构体,其中包括顶点数组、顶点数和边数。接着通过Init函数初始化邻接表。AddEdge函数用于添加边到邻接表中。最后,BFS函数基于图的广度优先搜索策略,判断以邻接表方式存储的有向图中是否存在由顶点Vj 到顶点Vi 的路径。如果存在路径,则返回1,否则返回0。
在main函数中,我们通过用户输入顶点数、边数、每条边的起点和终点,用AddEdge函数添加边到邻接表中。然后用户输入要查询的起点和终点,调用BFS函数判断是否存在路径。如果存在,则输出“存在从%d到%d的路径”,否则输出“不存在从%d到%d的路径”。
阅读全文