📜  用于检测有向图的循环的C程序(1)

📅  最后修改于: 2023-12-03 15:27:11.808000             🧑  作者: Mango

用于检测有向图的循环的C程序

当你需要判断一个有向图是否存在循环时,可以使用以下C程序来实现。

程序思路

利用深度优先遍历算法(DFS)来遍历有向图,同时利用一个visited数组用于记录遍历过的节点,以此来判断当前遍历节点是否已被遍历过,从而判断是否存在循环。

程序实现
#include <stdio.h>
#include <stdlib.h>

#define MAX_VERTEX_NUM 100   // 顶点的最大个数

typedef struct {
    int vertex[MAX_VERTEX_NUM];
    int arc[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
    int vertexNum;
    int arcNum;
} Graph;   // 图的结构体定义

int visited[MAX_VERTEX_NUM];

void createGraph(Graph *g) {  // 创建图
    int i, j, k;
    printf("请输入顶点数:");
    scanf("%d", &(g->vertexNum));
    printf("请输入边数:");
    scanf("%d", &(g->arcNum));
    printf("请输入顶点信息:\n");
    for (i = 0; i < g->vertexNum; ++i) {
        scanf("%d", g->vertex + i);
    }
    for (i = 0; i < g->vertexNum; ++i) {
        for (j = 0; j < g->vertexNum; ++j) {
            g->arc[i][j] = 0;
        }
    }
    printf("请输入边信息(起点,终点):\n");
    for (k = 0; k < g->arcNum; ++k) {
        scanf("%d,%d", &i, &j);
        g->arc[i][j] = 1;
    }
}

void DFS(Graph*g, int num) { //深度优先遍历
    int k;
    visited[num] = 1;
    printf("%d\t", g->vertex[num]);
    for (k = 0; k < g->vertexNum; ++k) {
        if (g->arc[num][k] != 0 && visited[k] == 0) {
            DFS(g, k);
        }
    }
}

int checkLoop(Graph* g) { // 判断是否存在循环
    int i;
    for (i = 0; i < g->vertexNum; ++i) {
        visited[i] = 0;
    }
    for (i = 0; i < g->vertexNum; ++i) {
        if (visited[i] == 0) {
            DFS(g, i);
        }
        else {
            return 1;
        }
    }
    return 0;
}

void destroyGraph(Graph *g) {  // 销毁图
    g->arcNum = 0;
    g->vertexNum = 0;
}

int main() {
    Graph g;
    int isLoop;
    createGraph(&g);
    isLoop = checkLoop(&g);
    if (isLoop) {
        printf("存在循环!\n");
    }
    else {
        printf("不存在循环!\n");
    }
    destroyGraph(&g);
    return 0;
}
程序说明
数据结构

定义了一个结构体Graph,用于存储图的数据信息。参数包括:

  • 一个一维数组vertex,存储图的顶点信息
  • 一个二维数组arc,存储边的信息
  • 一个整型vertexNum,表示图中顶点的个数
  • 一个整型arcNum,表示图中边的个数
函数实现

createGraph

函数参数:Graph*

函数功能:创建有向图

实现过程:输入顶点和边的信息,构建图的数据结构

DFS

函数参数:Graph*,int

函数功能:深度优先遍历顶点

实现过程:遍历顶点,并标记已访问的顶点

checkLoop

函数参数:Graph*

函数功能:判断是否存在循环

实现过程:利用深度优先遍历算法(DFS)遍历有向图,同时利用一个visited数组用于记录遍历过的节点,以此来判断当前遍历节点是否已被遍历过,从而判断是否存在循环。

destroyGraph

函数参数:Graph*

函数功能:销毁有向图

实现过程:释放图的数据占用的内存空间

测试数据

输入如下数据:

请输入顶点数:4
请输入边数:4
请输入顶点信息:
0 1 2 3
请输入边信息(起点,终点):
0,1
0,2
1,2
2,0

输出结果:

存在循环!
总结

以上就是检测有向图循环的C程序的实现过程和测试。通过深度优先遍历算法,能够快速、准确地检测图的循环情况,给程序员提供了一种方便快捷的工具。