求无向图的简单最大环

 

以poj3895为例:

 思想很简单,就是有dfs遍历图并且用一个数组记录所走的长度。当来到一个点是已经访问过的,则肯定形成一个环,更新环的长度,直到所有点访问完为止。

代码:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define _Clr(x, y) memset(x, y, sizeof(x))
 5 #define INF 0x3f3f3f3f
 6 #define N 5000
 7 using namespace std;
 8 
 9 int head[N], tot;
10 struct Edge
11 {
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是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,则输出路径上的顶点,否则输出未找到路径的提示信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值