当前位置: 首页 > news >正文

图论基础知识

基础知识

树与图的存储

在算法竞赛或工程中,图通常有两种常见的存储方式:邻接矩阵邻接表

  • 邻接矩阵:适合稠密图(边接近 n^2),空间消耗大 O(n^2)),查询快。
  • 邻接表:适合稀疏图(边较少),存储紧凑 O(n+m),是主流做法。

以下是 邻接表存储模板

const int N = 10000, M = N * 2; // N是点数,M是边数
int e[M], ne[M], h[N], w[M];    // e存储节点,ne存储next指针,h存储表头,w存储边权
int idx;void add(int a, int b, int c) {e[idx] = b;        // 边 a -> bw[idx] = c;        // 边权ne[idx] = h[a];    // 指向上一条边h[a] = idx++;      // 更新表头
}
  • e[idx] 表示边的终点。
  • w[idx] 表示边的权重。
  • ne[idx] 表示同一个起点的上一条边(链式前向星)。
  • h[a] 表示点 a 的邻接表的表头。
  • idx 为边的计数器,每次插入新边自增。

👉 常用套路:存无向图时要调用 add(a, b, w); add(b, a, w);


树与图的关系

  • 树(Tree) 是一种特殊的图:
    1. 无环
    2. 连通
    3. 有 n−1 条边(对于 n 个节点)。
  • 有向无环图(DAG, Directed Acyclic Graph)
    DAG 中不存在环,可以定义拓扑序列
    • 拓扑序列:若图中存在一条有向边 u→v,则在序列中 u一定位于 v前面。

度(Degree)

  • 入度(In-degree):有多少条边指向该点。
  • 出度(Out-degree):从该点出发有多少条边。

有向图 中经常用到入度信息,特别是拓扑排序。


拓扑排序(Topological Sorting)

直观理解

拓扑序就是按照依赖关系排队。例如:

  • 学习计划中,必须先学「数据结构」才能学「图论」。
  • 先修课程完成,后修课程才能进行。

算法思路(Kahn 算法)

  1. 计算所有节点的入度,存到数组 d[]
  2. 找出所有入度为 0 的点,入队。
  3. 不断出队:
    • 将该点加入拓扑序列;
    • 删除它发出的所有边,相邻点入度减 1;
    • 若某个点入度变为 0,则入队。
  4. 循环直到队列为空。

性质

  • 如果图中有环,拓扑排序无法包含所有节点。
  • 无环图(DAG)一定至少存在一个入度为 0 的点

代码模板

vector<int> topo_sort(int n, vector<vector<int>>& edges) {vector<int> indeg(n, 0);     // 入度vector<vector<int>> g(n);    // 邻接表for (auto& e : edges) {g[e[0]].push_back(e[1]);indeg[e[1]]++;}queue<int> q;for (int i = 0; i < n; i++)if (indeg[i] == 0) q.push(i);vector<int> res;while (!q.empty()) {int u = q.front(); q.pop();res.push_back(u);for (int v : g[u]) {if (--indeg[v] == 0)q.push(v);}}return res; // 若 res.size() < n,则图中有环
}

总结

  • 树是无环连通图,边数是 n−1。
  • 图的存储常用邻接表(链式前向星)。
  • DAG 的关键算法是拓扑排序。
  • 拓扑排序保证「依赖在前,结果在后」。

文章转载自:

http://5fUSTpKv.LcptL.cn
http://pVvB9C2N.LcptL.cn
http://suM6yLNi.LcptL.cn
http://6D4D4dD2.LcptL.cn
http://yZEMKeEe.LcptL.cn
http://38l8yHuO.LcptL.cn
http://205Dm9Lc.LcptL.cn
http://XpUXAvVq.LcptL.cn
http://ArfMOqU4.LcptL.cn
http://e1S2pzVH.LcptL.cn
http://dxpsJnOq.LcptL.cn
http://BeWTFEcL.LcptL.cn
http://1X4XYF11.LcptL.cn
http://tyv878gZ.LcptL.cn
http://7H9ZCHM5.LcptL.cn
http://DLQdvdf2.LcptL.cn
http://MvTGd5el.LcptL.cn
http://gdrt85Bd.LcptL.cn
http://jTQv20YI.LcptL.cn
http://m2XQYMZQ.LcptL.cn
http://ox28vIRp.LcptL.cn
http://gt5M45IW.LcptL.cn
http://HiQVKnCd.LcptL.cn
http://e40nBUYs.LcptL.cn
http://xRLgz8Z3.LcptL.cn
http://xXicLHtx.LcptL.cn
http://ZIC33qyg.LcptL.cn
http://VP8tqz1q.LcptL.cn
http://ENwlQS4G.LcptL.cn
http://jURTSnrk.LcptL.cn
http://www.dtcms.com/a/381874.html

相关文章:

  • DMA硬件架构解析:总线矩阵与核心组件
  • 从军用到掌心:固态硬盘(SSD)的演进与革命
  • 通俗解释redis高级:redis持久化(RDB持久化、AOF持久化)、redis主从、redis哨兵、redis分片集群
  • 【C++】类和对象——(上)
  • 解决Windows系统“‘php‘ 不是内部或外部命令”报错的完整指南
  • 用 Go 打造一个服务器资源指标采集器:结合 Prometheus Exporter 实战
  • Unity学习----【进阶】TextMeshPro学习(二)--进阶知识点(样式表,颜色渐变预设,精灵图片资源)
  • 从理论到落地:神经网络稀疏化设计构架中网络剪枝的深度实践与创新
  • ARM、AArch64、amd64、x86_64、x86有什么区别?
  • 机器学习项目-南方电网电力负荷预测
  • python标准库有哪些模块,简单总结下。
  • 文献阅读·MCformer:基于混合通道变换的多变量时间序列预测
  • 【软件操作】飞牛nas系统:笔记本息屏、合盖均不关机
  • 【SPI】【二】SPI控制器驱动代码详解
  • pandas读取复合列名列头及数据和处理
  • jenkins触发部署
  • 【pure-admin】项目登录验证码实现分析
  • Docker快速入门手册
  • 【C++设计模式】第五篇:装饰器模式
  • linux C 语言开发 (十) 进程间通讯--信号
  • 绿色环保活动平台(AI问答、WebSocket即时通讯、协同过滤算法、Echarts图形化分析)
  • 飞算JavaAI实战高效构建电商系统核心功能模块全解析
  • CSS 技巧使页脚始终位于网页的底部
  • Vue3》》eslint Prettier husky
  • 基因组多组学(第七篇空间HD文章)--基于蛋白质组学的分类揭示IDH突变型星形细胞瘤中存在免疫热亚型且预后较差
  • 【无人机】无人机用户体验测试策略详细介绍
  • Bev 感知模型量化 有哪些问题
  • 深入探索React渲染原理与性能优化策略
  • 域名SSL证书免费申请lcjmSSL
  • 贪心算法应用:投资组合再平衡问题详解