加权图

概述

加权图(weighted graph)是在图的基础上为每条边赋予一个权重(weight)的图结构,形式化表示为权重函数 。权重可以表示距离、费用、时间、容量等现实量度。加权图的核心问题之一是最短路径问题(shortest path problem):给定源顶点 和目标顶点 ,在所有从 的路径中找到总权重最小的路径。Dijkstra 算法是求解单源最短路径的经典贪心算法,其时间复杂度为 (使用最小堆实现)。加权图广泛应用于网络路由、地图导航、物流优化等领域。

定义

加权图(Weighted Graph)

一个加权图是一个三元组 ,其中:

  • 顶点集(vertices)
  • 集(edges)
  • 权重函数(weight function),为每条边 分配一个实数权重

权重可以是正数、负数或零。若所有权重均为非负数(),则称该加权图为非负加权图

路径权重与最短路径(Path Weight & Shortest Path)

是加权图 中从顶点 到顶点 的一条路径,则路径 权重定义为:

最短路径是所有 - 路径中权重最小的路径:

不存在路径,则

Dijkstra 算法(Dijkstra's Algorithm)

Dijkstra 算法用于求解非负加权图中的单源最短路径问题。给定源顶点 ,算法计算 到所有其他顶点的最短距离。

核心思想(贪心策略):维护一个距离集合 ,初始时 )。每次从尚未确定最短路径的顶点中选取 值最小的顶点 ,将其标记为”已确定”,然后通过 松弛(relax)其所有邻居的距离:

算法步骤

  1. 初始化:),所有顶点标记为未访问
  2. 重复以下步骤直到所有顶点已访问:
    • 从未访问顶点中选取 值最小的顶点
    • 标记 为已访问
    • 的每个未访问邻居 ,执行松弛操作
  3. 算法终止时, 即为 的最短距离

时间复杂度:使用最小堆(优先队列)实现为

核心性质

性质描述备注
非负权重前提Dijkstra 算法要求所有边权重 存在负权边时可能得到错误结果
贪心最优子结构最短路径的子路径仍是最短路径最优子结构是贪心策略正确性的基础
松弛单调性每次松弛操作只会减小或保持距离值不变 单调递减直至收敛到最短距离
确定性一旦顶点被标记为已访问,其最短距离不再改变仅在非负权重条件下成立
单源性Dijkstra 算法一次运行求解从源点到所有其他顶点的最短路径不同于 Floyd-Warshall 的全源最短路径
负权环检测非负加权图不存在负权环若存在负权环,最短路径可能无下界

关系网络

graph LR
    A["加权图"] --> B["基本结构"]
    A --> C["核心问题"]
    A --> D["经典算法"]
    A --> E["实际应用"]

    B --> B1["顶点集 V"]
    B --> B2["边集 E"]
    B --> B3["权重函数 w: E→R"]

    C --> C1["最短路径问题"]
    C --> C2["最小生成树"]
    C --> C3["最大流问题"]

    D --> D1["[[离散数学/concepts/贪心算法]]"]
    D --> D2["Dijkstra 算法"]
    D --> D3["Bellman-Ford 算法"]
    D --> D4["Floyd-Warshall 算法"]

    E --> E1["网络路由"]
    E --> E2["地图导航"]
    E --> E3["物流优化"]

    A --> F["关联概念"]
    F --> F1["[[离散数学/concepts/哈密顿路径]]"]
    F --> F2["[[离散数学/concepts/贪心算法]]"]
    F --> F3["[[离散数学/concepts/算法复杂度]]"]
  • 前置知识:图的基本概念(顶点、边、路径)
  • 核心关联:加权图通过权重函数扩展了图的建模能力,使图能够表示距离、费用等带量度的现实问题。Dijkstra 算法是贪心策略在图论中的经典应用
  • 后继概念哈密顿路径(加权图中的哈密顿路径即旅行商问题 TSP)

章节扩展

第10章:图论

加权图是 Rosen 第8版第10章中图论应用的重要扩展内容。在基本图论概念(路径、连通性)的基础上,加权图引入了权重函数,使图论能够解决更丰富的优化问题。

Dijkstra 算法的正确性证明:Dijkstra 算法的正确性基于贪心选择性质和最优子结构。关键不变式:当顶点 被标记为已访问时, 已经是最短距离。证明采用反证法——假设存在更短的路径经过某个未访问顶点,则由于所有边权重非负,该未访问顶点的距离值应更小,与 是当前最小距离顶点的选择矛盾。

与其他最短路径算法的比较

算法适用条件时间复杂度特点
Dijkstra非负权重贪心策略,效率高
Bellman-Ford允许负权边可检测负权环
Floyd-Warshall允许负权边全源最短路径

第11章:树

加权连通图上的最小生成树(Minimum Spanning Tree, MST)是第11章的核心内容之一。

Prim 算法:从任意顶点出发,贪心地选择与当前生成树相连的最小权重边,逐步扩展生成树直到包含所有顶点。时间复杂度 (朴素)或 (最小堆)。

Kruskal 算法:将所有边按权重排序,依次选择不形成环的最小权重边。使用并查集(Union-Find)检测环,时间复杂度

割性质(Cut Property):设 是顶点集的一个子集, 是跨越割 的最小权重边,则 属于某棵最小生成树。

补充

加权图的实际应用

加权图在现实世界中有着广泛的应用:

  • 网络路由:OSPF 协议使用 Dijkstra 算法计算最短路由路径,权重可以是链路带宽、延迟等
  • 地图导航:Google Maps、高德地图等导航系统以道路交叉路口为顶点、道路为边、行驶距离/时间为权重,求解最短路径
  • 物流优化:配送路线规划中,仓库和客户地点构成顶点,运输成本/距离构成权重
  • 社交网络分析:以用户交互频率为权重,发现最紧密的社交关系链

Dijkstra 算法的实现要点

  • 使用最小堆(优先队列)维护未访问顶点的距离值,可将朴素实现的 优化为
  • 松弛操作是 Dijkstra 算法的核心步骤,每次通过已确定顶点更新其邻居的距离估计值
  • 实际应用中常配合前驱数组(predecessor array)记录最短路径的具体走向

常见误区

  • Dijkstra 算法不能处理负权边:若图中存在负权边,贪心选择可能导致错误结果,应改用 Bellman-Ford 算法
  • 最短路径不一定是边数最少的路径:加权图中,边数少但权重大的路径可能不如边数多但权重小的路径
  • 权重可以为零:零权边不违反非负条件,Dijkstra 算法仍然正确

参见