c语言基于邻接矩阵判断图中是否有回路的函数
时间: 2024-03-12 11:46:03 浏览: 81
基于邻接矩阵判断图中是否有回路,可以使用深度优先搜索算法。下面是一个基于邻接矩阵的C语言函数实现:
```c
#define MAX_VERTEX_NUM 100 // 图的最大顶点数
typedef int VertexType; // 顶点类型
typedef int EdgeType; // 边权类型
typedef struct {
VertexType vexs[MAX_VERTEX_NUM]; // 顶点数组
EdgeType edges[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵
int n, e; // 顶点数和边数
} MGraph;
int visited[MAX_VERTEX_NUM]; // 访问标记数组
// DFS遍历图
int DFS(MGraph *G, int v, int parent) {
visited[v] = 1; // 标记当前节点为已访问
int i;
for (i = 0; i < G->n; i++) {
if (G->edges[v][i] != 0) { // 如果当前节点与节点i之间有边
if (!visited[i]) { // 如果节点i未被访问过
if (DFS(G, i, v)) // 递归遍历节点i
return 1; // 如果返回真,则说明存在回路
} else if (i != parent) { // 如果节点i已被访问过且不是当前节点的父节点
return 1; // 说明存在回路
}
}
}
return 0; // 没有找到回路
}
// 判断无向图是否有回路
int HasCycle(MGraph *G) {
int i;
for (i = 0; i < G->n; i++)
visited[i] = 0; // 初始化访问标记数组
for (i = 0; i < G->n; i++) {
if (!visited[i]) // 如果节点i未被访问过
if (DFS(G, i, -1)) // 从节点i开始遍历
return 1; // 如果返回真,则说明存在回路
}
return 0; // 不存在回路
}
```
其中,`DFS`函数用于深度优先遍历图,判断是否存在回路,`HasCycle`函数用于判断无向图是否有回路。函数中使用`visited`数组记录每个节点的访问状态,`parent`参数表示当前节点的父节点,用于判断是否存在回路。
阅读全文