用c语言写 在连通图中找一条从第u个顶点到第v个顶点的简单路径 功能:为pre申请一段内存空间,然后将pre数组中顶点个数的元素值替换成-1 将pre[u]置为-2表示初始下标为u的顶点已经被访问,且u没有前驱, 然后调用DFS_path方法 ,找到一条简单路径,最后释放pre。 参数:MGraph *G 是需要操作的图,int u是起始顶点的下标,int v是终止顶点的下标 返回值:无。
时间: 2024-03-10 12:44:43 浏览: 49
已知有向图和图中两个顶点u和v,试编写算法求有向图中从u到v的所有简单路径。
5星 · 资源好评率100%
下面是用 C 语言实现在连通图中找一条从第 u 个顶点到第 v 个顶点的简单路径的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100 // 最大顶点数
#define FALSE 0
#define TRUE 1
typedef struct {
int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵
int vexnum; // 顶点数
int arcnum; // 边数
} MGraph;
int visited[MAX_VERTEX_NUM]; // 访问标记数组
int *pre; // 前驱顶点数组
// 深度优先搜索遍历连通图
void DFS(MGraph *G, int v) {
int i;
visited[v] = TRUE;
printf("%d ", v);
for (i = 0; i < G->vexnum; i++) {
if (G->arcs[v][i] != 0 && !visited[i]) {
DFS(G, i);
}
}
}
// 深度优先搜索遍历连通图,求从 u 到 v 的一条简单路径
void DFS_path(MGraph *G, int u, int v) {
int i;
visited[u] = TRUE;
for (i = 0; i < G->vexnum; i++) {
if (G->arcs[u][i] != 0 && !visited[i]) {
pre[i] = u;
DFS_path(G, i, v);
}
}
}
// 在连通图中找一条从第 u 个顶点到第 v 个顶点的简单路径
void FindPath(MGraph *G, int u, int v) {
int i;
pre = (int *)malloc(sizeof(int) * G->vexnum);
for (i = 0; i < G->vexnum; i++) {
pre[i] = -1;
}
pre[u] = -2;
DFS_path(G, u, v);
printf("从%d到%d的一条简单路径为:", u, v);
if (pre[v] == -1) {
printf("不存在!\n");
} else {
i = v;
printf("%d", v);
while (pre[i] != -2) {
printf("<-%d", pre[i]);
i = pre[i];
}
printf("\n");
}
free(pre);
}
int main() {
MGraph G = {
{{0, 1, 1, 0, 0}, {1, 0, 0, 1, 1}, {1, 0, 0, 1, 0}, {0, 1, 1, 0, 1}, {0, 1, 0, 1, 0}}, 5, 7
};
int u = 0, v = 4;
int i;
printf("连通图的遍历结果为:");
for (i = 0; i < G.vexnum; i++) {
visited[i] = FALSE;
}
DFS(&G, 0);
printf("\n");
FindPath(&G, u, v);
return 0;
}
```
这里先用 DFS 遍历整个连通图,并打印遍历结果。然后通过 DFS_path 方法,求出从 u 到 v 的一条简单路径,并打印出来。在 DFS_path 方法中,用 pre 数组记录每个顶点的前驱顶点。最后释放 pre 数组的内存空间。
阅读全文