假设图G采用邻接表存储,利用深度优先搜索方法求出无向图中通过给定点v的简单回路。用C语言实现
时间: 2024-02-25 07:57:26 浏览: 22
以下是C语言实现代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100 // 最大顶点数
#define MAX_ARC_NUM 1000 // 最大边数
// 边结构体
typedef struct ArcNode {
int adjvex; // 邻接点编号
struct ArcNode *nextarc; // 指向下一个邻接点
} ArcNode;
// 顶点结构体
typedef struct {
int data; // 顶点数据
ArcNode *firstarc; // 指向第一个邻接点
} VNode;
// 图结构体
typedef struct {
VNode vertex[MAX_VERTEX_NUM]; // 顶点数组
int vexnum; // 顶点数
int arcnum; // 边数
} Graph;
void CreateGraph(Graph *G) {
int i, j, k;
printf("请输入顶点数和边数:");
scanf("%d %d", &G->vexnum, &G->arcnum);
printf("请输入各个顶点的数据:");
for (i = 0; i < G->vexnum; ++i) {
scanf("%d", &G->vertex[i].data);
G->vertex[i].firstarc = NULL;
}
printf("请输入各个边的顶点序号(用空格分隔):\n");
for (k = 0; k < G->arcnum; ++k) {
scanf("%d %d", &i, &j);
ArcNode *arc1 = (ArcNode *) malloc(sizeof(ArcNode));
arc1->adjvex = j;
arc1->nextarc = G->vertex[i].firstarc;
G->vertex[i].firstarc = arc1;
ArcNode *arc2 = (ArcNode *) malloc(sizeof(ArcNode));
arc2->adjvex = i;
arc2->nextarc = G->vertex[j].firstarc;
G->vertex[j].firstarc = arc2;
}
}
int visited[MAX_VERTEX_NUM]; // 记录顶点是否被访问过
int path[MAX_VERTEX_NUM]; // 记录路径上的顶点
int path_len; // 路径长度
int start_vex; // 起始顶点
int find_flag; // 是否找到路径的标志
void DFS(Graph *G, int v, int parent) {
visited[v] = 1; // 标记顶点v已被访问
path[path_len++] = v; // 将v加入路径中
ArcNode *p = G->vertex[v].firstarc;
while (p != NULL && !find_flag) {
if (p->adjvex == start_vex && path_len > 2) { // 找到了简单回路
path[path_len++] = p->adjvex; // 将起始顶点加入路径中
find_flag = 1; // 标记已找到路径
return;
}
if (visited[p->adjvex] == 0) { // 如果邻接点未被访问
DFS(G, p->adjvex, v); // 以该邻接点为起点递归搜索
} else if (p->adjvex != parent && path_len > 2) { // 如果邻接点已被访问且不是父节点,说明找到了环
int i;
for (i = path_len - 1; i >= 0; --i) { // 从路径中找到环的起点
if (path[i] == p->adjvex) break;
}
for (; i < path_len; ++i) { // 将环上的顶点加入路径中
path[path_len++] = path[i];
}
find_flag = 1; // 标记已找到路径
return;
}
p = p->nextarc;
}
visited[v] = 0; // 回溯,将顶点v标记为未访问状态
path_len--; // 从路径中删除顶点v
}
int main() {
Graph G;
CreateGraph(&G);
printf("请输入起始顶点:");
scanf("%d", &start_vex);
path_len = 0;
find_flag = 0;
DFS(&G, start_vex, -1);
if (find_flag) {
printf("简单回路为:");
int i;
for (i = 0; i < path_len; ++i) {
printf("%d ", G.vertex[path[i]].data);
}
} else {
printf("未找到简单回路");
}
return 0;
}
```
这段代码实现了深度优先搜索方法求出无向图中通过给定点v的简单回路。其中,visited数组记录顶点是否被访问过,path数组记录路径上的顶点,path_len变量记录路径长度,start_vex变量记录起始顶点,find_flag变量记录是否找到路径。在DFS函数中,首先将当前顶点标记为已访问并加入路径中,然后遍历所有邻接点,如果找到了简单回路或环,则将路径上的顶点加入path数组中,并标记find_flag为1,表示已找到路径。如果遍历完所有邻接点仍未找到路径,则将当前顶点标记为未访问状态,并从路径中删除该顶点,回溯到上一个顶点继续搜索。最后,如果find_flag为1,则输出路径上的顶点,否则输出未找到路径的提示信息。