图的详细介绍(存储,拓扑排序,最短路径)【数据结构】

在这里插入图片描述

图的基本术语介绍

图(Graph)是一种常见的数据结构,用于表示多个对象之间的关系。图由节点(Vertex)和边(Edge)组成,其中节点之间可以通过边相互连通。在图中,节点也被称为顶点(Vertex),边也被称为边(Edge)。根据边的方向和节点之间的关系,图通常分为有向图和无向图。有向图中的边有方向,无向图中的边没有方向。

图的存储

图的存储方式主要包括邻接矩阵和邻接表两种常见方法。邻接矩阵使用二维数组来表示图的连接关系,而邻接表则通过链表或数组的方式来表达节点之间的连接关系。

邻接矩阵

邻接矩阵是使用二维数组来表示图中节点之间的连接关系。对于有向图,矩阵中某个元素表示从一行对应的节点到一列对应的节点的一条边。对于无向图,矩阵是对称的,因为边是双向的。

优点:可以快速判断任意两个节点之间是否有边连接,适用于稠密图

缺点:对于稀疏图会占用较多的空间;添加和删除边的操作复杂度高

邻接表

邻接表是使用链表或数组的方式来表示节点之间的连接关系。对于每个节点,通过一个链表或数组来存储与其相邻的节点。

优点:对于稀疏图占用的空间较小;支持动态的添加和删除边

缺点:判断任意两个节点之间是否有边连接的时间复杂度较高

拓扑排序

拓扑排序是对有向无环图(DAG)中所有节点的线性序列化,使得对于每一条有向边<u, v>,u在序列中都排在v的前面。拓扑排序通常用于表示一些有依赖关系的任务的执行顺序。

#include <iostream>
#include <vector>
#include <queue>

std::vector<int> topologicalSort(std::vector<std::vector<int>>& graph) {
    int n = graph.size();
    std::vector<int> indegree(n, 0);
    for (int i = 0; i < n; ++i) {
        for (int j : graph[i]) {
            indegree[j]++;
        }
    }

    std::queue<int> q;
    for (int i = 0; i < n; ++i) {
        if (indegree[i] == 0) {
            q.push(i);
        }
    }

    std::vector<int> result;
    while (!q.empty()) {
        int u = q.front();
        q.pop();
        result.push_back(u);
        for (int v : graph[u]) {
            indegree[v]--;
            if (indegree[v] == 0) {
                q.push(v);
            }
        }
    }

    return result;
}

求最短路径

求解图中的最短路径问题通常使用广度优先搜索(BFS)或者Dijkstra算法。其中BFS用于无权图,Dijkstra算法用于带权图。

使用BFS求解无权图最短路径
#include <iostream>
#include <vector>
#include <queue>

std::vector<int> shortestPathBFS(std::vector<std::vector<int>>& graph, int start) {
    int n = graph.size();
    std::vector<int> dist(n, -1);
    std::queue<int> q;

    dist[start] = 0;
    q.push(start);

    while (!q.empty()) {
        int u = q.front();
        q.pop();
        for (int v : graph[u]) {
            if (dist[v] == -1) {
                dist[v] = dist[u] + 1;
                q.push(v);
            }
        }
    }
    return dist;
}
使用Dijkstra算法求解带权图最短路径
#include <iostream>
#include <vector>
#include <queue>

std::vector<int> dijkstra(std::vector<std::vector<std::pair<int, int>>>& graph, int start) {
    int n = graph.size();
    std::vector<int> dist(n, INT_MAX);
    std::priority_queue<std::pair<int, int>, std::vector<std::pair<int, int>>, std::greater<std::pair<int, int>>> pq;

    dist[start] = 0;
    pq.push({0, start});

    while (!pq.empty()) {
        int u = pq.top().second;
        int d = pq.top().first;
        pq.pop();
        if (d > dist[u]) {
            continue;
        }

        for (auto& edge : graph[u]) {
            int v = edge.first;
            int w = edge.second;
            if (dist[u] + w < dist[v]) {
                dist[v] = dist[u] + w;
                pq.push({dist[v], v});
            }
        }
    }
    return dist;
}

在上述示例中, topologicalSort函数用于对给定的有向图进行拓扑排序并返回结果,shortestPathBFS用于求解无权图的最短路径,dijkstra函数用于求解带权图的最短路径。

如果你想更深入地了解人工智能的其他方面,比如机器学习、深度学习、自然语言处理等等,也可以点击这个链接,我按照如下图所示的学习路线为大家整理了100多G的学习资源,基本涵盖了人工智能学习的所有内容,包括了目前人工智能领域最新顶会论文合集和丰富详细的项目实战资料,可以帮助你入门和进阶。

链接: 人工智能交流群【最新顶会与项目实战】(点击跳转)

在这里插入图片描述

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RRRRRoyal

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值