图论可达性c语言实现

简介: 这篇文章详细解释了图论中可达性的概念,并提供了无向图和有向图的C语言实现代码,包括图的初始化、边的添加、深度优先搜索(DFS)以及可达性的检查。

概述

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

  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);
    }
}

测试无向图

有向图完整代码

#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);
    }
}

测试有向图

目录
相关文章
|
算法 网络协议 测试技术
国密SSL协议之性能测试
国密SSL在实际上线和使用过程中,性能就是一个必须面对的问题。 国密SSL和标准SSL相比,算一个新生事物,没有完善齐备的性能测试工具。 本文针对国密SSL性能测试,描述了相关指标,并提供一些基本的方法和工具。
2717 0
国密SSL协议之性能测试
|
消息中间件 分布式计算 NoSQL
大数据-104 Spark Streaming Kafka Offset Scala实现Redis管理Offset并更新
大数据-104 Spark Streaming Kafka Offset Scala实现Redis管理Offset并更新
314 0
|
运维 关系型数据库 MySQL
阿里云瑶池助力华鼎冷链科技:零ETL畅享高性能数据生态
为解决自建TiDB带来的运维难题和高昂成本,华鼎采用阿里云PolarDB MySQL与AnalyticDB MySQL,通过Zero-ETL实现数据无感集成,大幅降低成本、提升性能和效率,并实现了异地灾备、秒级查询和BI分析等功能,助力业务快速发展。
556 5
阿里云瑶池助力华鼎冷链科技:零ETL畅享高性能数据生态
|
机器学习/深度学习 安全 物联网安全
探索未来网络:物联网安全的最佳实践与创新策略
本文旨在深入探讨物联网(IoT)的安全性问题,分析其面临的主要威胁与挑战,并提出一系列创新性的解决策略。通过技术解析、案例研究与前瞻展望,本文不仅揭示了物联网安全的复杂性,还展示了如何通过综合手段提升设备、数据及网络的安全性。我们强调了跨学科合作的重要性,以及在快速发展的技术环境中保持敏捷与适应性的必要性,为业界和研究者提供了宝贵的参考与启示。
|
存储 监控 安全
智慧社区可视化解决方案:科技引领社区服务与管理新篇章
智慧社区通过现代科技整合区域资源,提升治理和服务水平,为居民提供便捷、高效、安全的生活环境。其特点包括科技赋能、资源整合和以人为本,旨在实现社区现代化管理,提高居民满意度。未来将应用更多创新技术,推动社区治理现代化。
765 16
|
运维 Linux Apache
如何使用`systemctl status`命令来查看服务状态?
如何使用`systemctl status`命令来查看服务状态?
1701 0
|
网络协议 Linux
Linux——Centos8.2如何重启网卡服务
Linux——Centos8.2如何重启网卡服务
666 0
|
开发框架 搜索推荐 安全
【Uniapp 专栏】基于 Uniapp 的电商应用开发案例解析
【5月更文挑战第12天】使用Uniapp跨平台框架开发电商应用,结合丰富的组件和API,实现首页、商品详情、购物车及订单等关键功能。注重界面设计和用户体验,处理商品逻辑、订单管理和支付接口集成。同时,适应多平台特性,加入个性化推荐、商品直播和社交分享等特色功能,以降低成本、提升竞争力,打造高效购物体验。此案例展示了Uniapp在电商领域的潜力和优势。
726 4
|
JSON 程序员 数据格式
程序员必知:同步接口和异步接口
程序员必知:同步接口和异步接口
1581 0
|
敏捷开发 算法 数据安全/隐私保护
需求分解
需求分解
474 0