用C语言编写一个算法,判别以邻接表方式存储的有向图是否存在顶点i到顶点j的路径
时间: 2024-11-25 14:20:32 浏览: 3
在C语言中,我们可以使用深度优先搜索(DFS)或广度优先搜索(BFS)来判断有向图中是否存在从顶点i到顶点j的路径。这里以DFS为例,因为DFS更适合寻找连通路径。
首先,我们需要定义一个邻接表结构来表示图:
```c
typedef struct Node {
int data;
struct Node* next;
} Node;
typedef struct {
Node** adj; // 邻接列表
int V; // 顶点数
} Graph;
```
接下来是DFS函数实现:
```c
// 初始化邻接表
void initGraph(Graph* graph, int v) {
graph->V = v;
graph->adj = (Node**)malloc(v * sizeof(Node*));
for (int i = 0; i < v; ++i)
graph->adj[i] = NULL;
}
// DFS遍历检查路径
bool hasPathDFS(int src, int dest, Graph* graph) {
bool visited[v]; // 记录是否访问过每个节点
for (int i = 0; i < v; i++) {
visited[i] = false;
}
visited[src] = true;
Node* current = graph->adj[src];
while (current != NULL) {
if (current->data == dest) {
return true;
}
visited[current->data] = true;
current = current->next;
}
// 没有找到直接路径,逐层递归检查邻居
for (current = graph->adj[src]; current != NULL; current = current->next) {
if (!visited[current->data])
if (hasPathDFS(current->data, dest, graph))
return true;
}
return false;
}
```
最后,在主程序中,你可以像这样使用该函数:
```c
int main() {
int V, E;
// 假设输入了有向图的顶点数V和边的数量E以及邻接矩阵
Graph g;
initGraph(&g, V);
int src, dest;
scanf("%d %d", &src, &dest);
if (hasPathDFS(src - 1, dest - 1, &g)) {
printf("存在从顶点%d到顶点%d的路径\n", src, dest);
} else {
printf("不存在从顶点%d到顶点%d的路径\n", src, dest);
}
return 0;
}
```
阅读全文