图论可达性c语言实现

这篇具有很好参考价值的文章主要介绍了图论可达性c语言实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概述

       图论中的可达性是指在图中是否存在从一个顶点到另一个顶点的路径。这是图论中的一个基本概念,对于许多实际问题的建模和解决都非常重要。以下是关于图论可达性的一些重要概念和信息:

  1. 有向图和无向图: 图可以分为有向图和无向图。在有向图中,边有方向,从一个顶点到另一个顶点的路径是有向的。在无向图中,边没有方向,路径是无向的。

  2. 可达性定义: 在有向图中,从顶点A到顶点B的可达性表示存在一条有向路径从A到B。在无向图中,如果存在一条路径从顶点A到顶点B,那么A和B被认为是可达的。

  3. 深度优先搜索(DFS): DFS是一种用于遍历图的算法,可以用来检查可达性。通过从起始顶点开始,尽可能深入图中,直到无法继续为止。DFS可以用来查找路径并判断两个顶点之间是否可达。

  4. 广度优先搜索(BFS): BFS是另一种遍历图的算法,它从起始顶点开始,逐层遍历图。BFS也可以用于检查可达性,并找到最短路径。

  5. 图的表示: 图可以通过邻接矩阵或邻接表等方式表示。邻接矩阵是一个二维数组,其中元素表示顶点之间的连接关系。邻接表是一种更灵活的表示方法,使用链表来表示每个顶点的邻接顶点。

  6. 应用: 可达性在许多领域都有重要应用,如网络路由、社交网络分析、数据库查询优化等。在计算机科学和工程中,图的可达性是解决许多实际问题的关键步骤。

总的来说,图论中的可达性是一个关键的概念,它帮助我们理解图结构中的路径和连接关系,为解决各种问题提供了强大的工具。

以下是无向图的可达性实现代码。

无向图完整代码

#include <stdio.h>
#include <stdlib.h>

#define MAX_VERTICES 100

// 定义图的结构
struct Graph {
    int vertices;          // 图的顶点数
    int adjacencyMatrix[MAX_VERTICES][MAX_VERTICES];  // 邻接矩阵表示图的连接关系
};

// 函数声明
void initGraph(struct Graph* graph, int vertices);
void addEdge(struct Graph* graph, int start, int end);
void DFS(struct Graph* graph, int vertex, int visited[MAX_VERTICES]);
void checkReachability(struct Graph* graph, int start, int end);

int main() {
    struct Graph graph;
    int vertices, edges, start, end;

    // 输入图的顶点数和边数
    printf("输入图的顶点数和边数:");
    scanf("%d %d", &vertices, &edges);

    initGraph(&graph, vertices);

    // 输入图的边
    printf("输入图的边(每行包含两个顶点,表示一条边):\n");
    for (int i = 0; i < edges; i++) {
        int startVertex, endVertex;
        scanf("%d %d", &startVertex, &endVertex);
        addEdge(&graph, startVertex, endVertex);
    }

    // 输入要检查可达性的起始点和结束点
    printf("输入要检查可达性的起始点和结束点:");
    scanf("%d %d", &start, &end);

    // 检查可达性
    checkReachability(&graph, start, end);

    return 0;
}

// 初始化图
void initGraph(struct Graph* graph, int vertices) {
    graph->vertices = vertices;

    // 初始化邻接矩阵
    for (int i = 0; i < vertices; i++) {
        for (int j = 0; j < vertices; j++) {
            graph->adjacencyMatrix[i][j] = 0;
        }
    }
}

// 添加边
void addEdge(struct Graph* graph, int start, int end) {
    // 有向图,将起始点到结束点的边标记为1
    graph->adjacencyMatrix[start][end] = 1;
}

// 深度优先搜索
void DFS(struct Graph* graph, int vertex, int visited[MAX_VERTICES]) {
    visited[vertex] = 1;
    printf("%d ", vertex);

    for (int i = 0; i < graph->vertices; i++) {
        if (graph->adjacencyMatrix[vertex][i] == 1 && !visited[i]) {
            DFS(graph, i, visited);
        }
    }
}

// 检查可达性
void checkReachability(struct Graph* graph, int start, int end) {
    int visited[MAX_VERTICES] = {0};

    printf("从顶点 %d 出发,DFS 遍历结果为:", start);
    DFS(graph, start, visited);

    if (visited[end]) {
        printf("\n%d 可达 %d\n", start, end);
    } else {
        printf("\n%d 不可达 %d\n", start, end);
    }
}

测试无向图

图论可达性c语言实现,图论,c语言,深度优先

图论可达性c语言实现,图论,c语言,深度优先

有向图完整代码

#include <stdio.h>
#include <stdlib.h>

#define MAX_VERTICES 100

// 定义图的结构
struct Graph {
    int vertices;          // 图的顶点数
    int adjacencyMatrix[MAX_VERTICES][MAX_VERTICES];  // 邻接矩阵表示图的连接关系
};

// 函数声明
void initGraph(struct Graph* graph, int vertices);
void addEdge(struct Graph* graph, int start, int end);
void DFS(struct Graph* graph, int vertex, int visited[MAX_VERTICES]);
void checkReachability(struct Graph* graph, int start, int end);

int main() {
    struct Graph graph;
    int vertices, edges, start, end;

    // 输入图的顶点数和边数
    printf("输入图的顶点数和边数:");
    scanf("%d %d", &vertices, &edges);

    initGraph(&graph, vertices);

    // 输入图的边
    printf("输入图的边(每行包含两个顶点,表示一条边):\n");
    for (int i = 0; i < edges; i++) {
        int startVertex, endVertex;
        scanf("%d %d", &startVertex, &endVertex);
        addEdge(&graph, startVertex, endVertex);
    }

    // 输入要检查可达性的起始点和结束点
    printf("输入要检查可达性的起始点和结束点:");
    scanf("%d %d", &start, &end);

    // 检查可达性
    checkReachability(&graph, start, end);

    return 0;
}

// 初始化图
void initGraph(struct Graph* graph, int vertices) {
    graph->vertices = vertices;

    // 初始化邻接矩阵
    for (int i = 0; i < vertices; i++) {
        for (int j = 0; j < vertices; j++) {
            graph->adjacencyMatrix[i][j] = 0;
        }
    }
}

// 添加边
void addEdge(struct Graph* graph, int start, int end) {
    // 有向图,将起始点到结束点的边标记为1
    graph->adjacencyMatrix[start][end] = 1;
}

// 深度优先搜索
void DFS(struct Graph* graph, int vertex, int visited[MAX_VERTICES]) {
    visited[vertex] = 1;
    printf("%d ", vertex);

    for (int i = 0; i < graph->vertices; i++) {
        if (graph->adjacencyMatrix[vertex][i] == 1 && !visited[i]) {
            DFS(graph, i, visited);
        }
    }
}

// 检查可达性
void checkReachability(struct Graph* graph, int start, int end) {
    int visited[MAX_VERTICES] = {0};

    printf("从顶点 %d 出发,DFS 遍历结果为:", start);
    DFS(graph, start, visited);

    if (visited[end]) {
        printf("\n%d 可达 %d\n", start, end);
    } else {
        printf("\n%d 不可达 %d\n", start, end);
    }
}

测试有向图

图论可达性c语言实现,图论,c语言,深度优先

图论可达性c语言实现,图论,c语言,深度优先文章来源地址https://www.toymoban.com/news/detail-817780.html

到了这里,关于图论可达性c语言实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【JVM】并发的可达性分析详细解释

       ​ 🍎 个人博客: 个人主页 🏆 个人专栏: JVM   ⛳️   功不唐捐,玉汝于成 ​ 目录 前言 正文 可达性分析的基本原理: 根集合(Root Set): 对象引用关系: 标记-清除算法: 详细解释可达性分析的过程: 初始标记(Initial Mark): 并发标记(Concurrent Mark): 重新标

    2024年01月22日
    浏览(26)
  • Java垃圾回收-可达性分析算法,rabbitmq原理图

    虚拟机栈(栈帧中的本地变量表)中引用的对象。(可以理解为:引用栈帧中的本地变量表的所有对象) 方法区中静态属性引用的对象(可以理解为:引用方法区该静态属性的所有对象) 方法区中常量引用的对象(可以理解为:引用方法区中常量的所有对象) 本地方法栈中(Native方法)引用的

    2024年04月16日
    浏览(29)
  • 【Linux】测试ip:port端口是否连通即可达性测试

    【Linux】测试ip:port端口是否连通即可达性测试 0、背景 1、telnet可达性测试 2、curl可达性测试 3、wget可达性测试 0、背景 在视觉项目开发调试的过程中经常需要判定IPC是否可达,在做服务的时候也需要判定服务器是否可达。 本博客介绍3种常用的工具(telnet、curl、wget)进行可

    2023年04月17日
    浏览(30)
  • 可达性分析、三色标记、新生代、老年代的关系是什么

            jvm提供了垃圾回收器进行垃圾回收,垃圾回收器的职责就是回收内存中不再被引用的对象,以便释放内存。垃圾回收器利用可达性分析算法去分析哪些对象需要被回收,可达性分析算法是这样的:首先一些对象被定义为gc roots,然后沿着这些gc roots对象的引用链往下查

    2024年02月14日
    浏览(29)
  • 基于高斯两步移动搜寻法(2SFCA)的城市绿地可达性分析

    【2SFCA的基本思路,可以略过】 对每个供给点j,搜索所有在j搜寻半径(d0)范围内的需求点(k),计算供需比Rj;对每个需求点i,搜索所有在i搜寻半径(d0)范围内的供给点(j),将所有的供需比Rj加总得到i点的可达性Ai。 【数据】 成都市城区绿地数据、各街道小区数据、

    2023年04月21日
    浏览(29)
  • 【数据库+Engine】吉大核酸采样点空间分布与可达性分析系统集采样管理一键式平台报告

    无法直接粘贴图片 报告,源程序,介绍视频下载链接如下: https://download.csdn.net/download/qq_54263076/87354460 每一张表所对应的角色的领域范围和空间如下: 第一子集.核酸总流程表:单号ID,待检员ID,取样员ID,取样时间,取样地点,核酸试剂编号ID 第二子集.人员表:人员ID,姓

    2023年04月20日
    浏览(34)
  • JVM7:垃圾回收是什么?从运行时数据区看垃圾回收到底回收哪块区域?垃圾回收如何去回收?垃圾回收策略,引用计数算法及循环引用问题,可达性分析算法

    在Java中,垃圾回收(Garbage Collection,简称GC),是自动管理内存的机制。它负责检测不再使用的对象,并释放它们所占用的内存,以供其他对象使用。 JVM内存模型认识的差不多了,就应该思考,什么样的内存模型适合什么样的GC策略,包括垃圾回收为什么会出现。实际上,很多

    2024年02月11日
    浏览(26)
  • 【图论算法】深度优先搜索的应用

    深度优先搜索 (depth-first search)是对先序遍历(preorder traversal)的推广。我们从某个顶点 v 开始处理 v,然后递归地遍历所有邻接到 v 的顶点。 对一棵树的所有顶点的访问需 O(|E|) 时间。对任意图进行该过程时则需要考虑避免圈的出现。为此,当访问一个顶点 v 的时候,由于当时已

    2024年02月08日
    浏览(45)
  • [算法日志]图论: 深度优先搜索(DFS)

    ​ 深度优先搜索算法是一种遍历图这种数据结构的算法策略,其中心思想是朝图节点的一个方向不断跳转,当该节点无下一个节点或所有方向都遍历完时,便回溯朝上一个节点的另一个方向继续遍历。这种搜索策略与回溯法有异曲同工之妙。 正因为和回溯法有相似之处,所

    2024年02月03日
    浏览(46)
  • 图论与算法(3)图的深度优先遍历

    图的遍历 是指按照一定规则访问图中的所有顶点,以便获取图的信息或执行特定操作。常见的图遍历算法包括深度优先搜索(DFS)和广度优先搜索(BFS)。 深度优先搜索 (DFS):从起始顶点开始,递归或使用栈的方式访问相邻的顶点,直到所有顶点都被访问过为止。DFS通过

    2024年02月06日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包