惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
Application and Cybersecurity Blog
Application and Cybersecurity Blog
P
Privacy International News Feed
T
Tor Project blog
Spread Privacy
Spread Privacy
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
L
Lohrmann on Cybersecurity
博客园_首页
T
Tailwind CSS Blog
A
Arctic Wolf
P
Proofpoint News Feed
H
Help Net Security
V
Vulnerabilities – Threatpost
云风的 BLOG
云风的 BLOG
Microsoft Azure Blog
Microsoft Azure Blog
月光博客
月光博客
大猫的无限游戏
大猫的无限游戏
F
Fortinet All Blogs
罗磊的独立博客
阮一峰的网络日志
阮一峰的网络日志
酷 壳 – CoolShell
酷 壳 – CoolShell
aimingoo的专栏
aimingoo的专栏
D
DataBreaches.Net
博客园 - 聂微东
Security Latest
Security Latest
V
Visual Studio Blog
腾讯CDC
D
Darknet – Hacking Tools, Hacker News & Cyber Security
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Microsoft Security Blog
Microsoft Security Blog
I
InfoQ
S
Schneier on Security
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Cyberwarzone
Cyberwarzone
T
Tenable Blog
B
Blog RSS Feed
博客园 - 三生石上(FineUI控件)
N
Netflix TechBlog - Medium
The Cloudflare Blog
U
Unit 42
Latest news
Latest news
AWS News Blog
AWS News Blog
J
Java Code Geeks
N
News and Events Feed by Topic
Blog — PlanetScale
Blog — PlanetScale
G
Google Developers Blog
S
SegmentFault 最新的问题
M
MIT News - Artificial intelligence
Help Net Security
Help Net Security

博客园 - ChuckLu

英语背单词 专八词汇 中英对照 2026年07月 背单词 纯英文 2026年07月 sql exists and not exists 英语背单词 专八词汇 中英对照 2026年06月 背单词 纯英文 2026年06月 英语背单词 专八词汇 中英对照 2026年05月 背单词 纯英文 2026年05月 英语背单词 专八词汇 中英对照 2026年04月 背单词 纯英文 2026年04月 英语背单词 专八词汇 中英对照 2026年03月 背单词 纯英文 2026年03月 英语背单词 专八词汇 中英对照 2026年02月 背单词 纯英文 2026年02月 英语背单词 专八词汇 中英对照 2026年01月 背单词 纯英文 2026年01月 英语背单词 专八词汇 中英对照 2025年12月 背单词 纯英文 2025年12月 二叉树 节点的个数关系 二叉树 遍历 补码加减法 英语背单词 专八词汇 中英对照 2025年11月 背单词 纯英文 2025年11月 KMP算法 图论 Walks Trails and Paths 英语背单词 专八词汇 中英对照 2025年10月 背单词 纯英文 2025年10月
图 生成树
ChuckLu · 2025-10-15 · via 博客园 - ChuckLu

你提出的这个问题非常好,它触及了图的结构和生成树的核心概念。的确,图是由顶点(节点)和边(连接节点的线)组成的,它是一个固定的结构。但是,生成树是一个图中的特定子结构,并不是说图本身就自然地包含生成树。下面我将详细解释图和生成树之间的关系。

好的,我们将使用普里姆(Prim)算法,以顶点 a 为起点,来找出这个连通图的最小生成树(MST)。

普里姆算法简介

image

普里姆算法是一种贪心算法,用于在加权连通图中寻找最小生成树。其基本思想是:

  1. 初始化:选择一个起始顶点,并将其放入一个集合 U 中,该集合表示已经包含在最小生成树中的顶点。

  2. 循环:重复以下步骤,直到所有顶点都进入集合 U 中。

    • 在所有连接集合 U 内的顶点与集合 U 外的顶点的边中,找到一条权值最小的边。

    • 将这条权值最小的边加入最小生成树,并将该边所连接的 U 外的顶点加入集合 U


计算过程

给定的图信息:

  • 顶点(Vertices): {a, b, c, d, e, f, g}

  • 边(Edges)和权重(Weights):

    • ad(9), ab(2), af(5), bf(8), fg(1), bg(4), cg(6), bc(7), ec(10), be(3), bd(1), de(2)

以 a 为起点,逐步构建最小生成树:

初始状态:

  • 已选顶点集合 U = {a}

  • 最小生成树边集合 T = {}

  • 总权重 = 0

第 1 步:

  • 从集合 U = {a} 出发,寻找连接到集合外顶点的权值最小的边。

  • 候选边:(a, b) 权重 2,(a, f) 权重 5,(a, d) 权重 9。

  • 选择 (a, b),因为它的权重最小。

  • 操作:

    • 将顶点 b 加入 U。现在 U = {a, b}。

    • 将边 (a, b) 加入 T

    • 总权重 = 2。

第 2 步:

  • 从集合 U = {a, b} 出发,寻找连接到集合外顶点的权值最小的边。

  • 候选边 (忽略已连接到U内顶点的边):

    • 从 a: (a, f) 权重 5, (a, d) 权重 9

    • 从 b: (b, d) 权重 1, (b, e) 权重 3, (b, g) 权重 4, (b, c) 权重 7, (b, f) 权重 8

  • 在所有候选边中,(b, d) 的权重最小。

  • 操作:

    • 将顶点 d 加入 U。现在 U = {a, b, d}。

    • 将边 (b, d) 加入 T

    • 总权重 = 2 + 1 = 3。

第 3 步:

  • 从集合 U = {a, b, d} 出发,寻找连接到集合外顶点的权值最小的边。

  • 候选边:

    • 从 a: (a, f) 权重 5

    • 从 b: (b, e) 权重 3, (b, g) 权重 4, (b, c) 权重 7, (b, f) 权重 8

    • 从 d: (d, e) 权重 2

  • 在所有候选边中,(d, e) 的权重最小。

  • 操作:

    • 将顶点 e 加入 U。现在 U = {a, b, d, e}。

    • 将边 (d, e) 加入 T

    • 总权重 = 3 + 2 = 5。

第 4 步:

  • 从集合 U = {a, b, d, e} 出发,寻找连接到集合外顶点的权值最小的边。

  • 候选边:

    • 从 a: (a, f) 权重 5

    • 从 b: (b, g) 权重 4, (b, c) 权重 7, (b, f) 权重 8

    • 从 d: (无新的边)

    • 从 e: (e, c) 权重 10

  • 在所有候选边中,(b, g) 的权重最小。

  • 操作:

    • 将顶点 g 加入 U。现在 U = {a, b, d, e, g}。

    • 将边 (b, g) 加入 T

    • 总权重 = 5 + 4 = 9。

第 5 步:

  • 从集合 U = {a, b, d, e, g} 出发,寻找连接到集合外顶点的权值最小的边。

  • 候选边:

    • 从 a: (a, f) 权重 5

    • 从 b: (b, c) 权重 7, (b, f) 权重 8

    • 从 e: (e, c) 权重 10

    • 从 g: (g, f) 权重 1, (g, c) 权重 6

  • 在所有候选边中,(g, f) 的权重最小。

  • 操作:

    • 将顶点 f 加入 U。现在 U = {a, b, d, e, g, f}。

    • 将边 (g, f) 加入 T

    • 总权重 = 9 + 1 = 10。

第 6 步:

  • 从集合 U = {a, b, d, e, g, f} 出发,寻找连接到集合外顶点的权值最小的边。此时只剩下顶点 c 不在集合中。

  • 候选边:

    • 从 b: (b, c) 权重 7

    • 从 e: (e, c) 权重 10

    • 从 g: (g, c) 权重 6

  • 在所有候选边中,(g, c) 的权重最小。

  • 操作:

    • 将顶点 c 加入 U。现在 U = {a, b, c, d, e, f, g}。

    • 将边 (g, c) 加入 T

    • 总权重 = 10 + 6 = 16。

算法结束:

  • 所有顶点都已包含在集合 U 中,最小生成树构建完成。


最终结果

该连通图的最小生成树包含以下几条边:

  1. a — b (权重 2)

  2. b — d (权重 1)

  3. d — e (权重 2)

  4. b — g (权重 4)

  5. g — f (权重 1)

  6. g — c (权重 6)

最小生成树的总权重为:16

INF (无穷大) = 32767

--- 处理图 1 (顶点 A-G) ---

===================================
Prim 算法结果 (从顶点 A 开始):
-----------------------------------
  当前 V-U 集合中的候选边 (lowcost > 0 且 < INF):
    * 边 (B, A),权重: 2
    * 边 (D, A),权重: 9
    * 边 (F, A),权重: 5

--- 步骤 1.a: 查找 V-U 中 lowcost 最小的顶点 (min_cost 初始为 INF) ---
--- 查找完成:选取顶点 B,最小权重: 2 ---
--- 步骤 1.b: 更新 lowcost 和 closest (新加入顶点 B) ---
  * 检查顶点 V-U 中的 C:新边 (B,C) 权值 7 < 旧边 (A,C) 权值 INF,**更新** lowcost[C]=7,closest[C]=B。
  * 检查顶点 V-U 中的 D:新边 (B,D) 权值 1 < 旧边 (A,D) 权值 9,**更新** lowcost[D]=1,closest[D]=B。
  * 检查顶点 V-U 中的 E:新边 (B,E) 权值 3 < 旧边 (A,E) 权值 INF,**更新** lowcost[E]=3,closest[E]=B。
  * 检查顶点 V-U 中的 F:新边 (B,F) 权值 8 >= 旧边 (A,F) 权值 5,**不更新**。
  * 检查顶点 V-U 中的 G:新边 (B,G) 权值 4 < 旧边 (A,G) 权值 INF,**更新** lowcost[G]=4,closest[G]=B。
---------------------------------------------------------
  当前 V-U 集合中的候选边 (lowcost > 0 且 < INF):
    * 边 (C, B),权重: 7
    * 边 (D, B),权重: 1
    * 边 (E, B),权重: 3
    * 边 (F, A),权重: 5
    * 边 (G, B),权重: 4

--- 步骤 2.a: 查找 V-U 中 lowcost 最小的顶点 (min_cost 初始为 INF) ---
--- 查找完成:选取顶点 D,最小权重: 1 ---
--- 步骤 2.b: 更新 lowcost 和 closest (新加入顶点 D) ---
  * 检查顶点 V-U 中的 C:新边 (D,C) 权值 INF >= 旧边 (B,C) 权值 7,**不更新**。
  * 检查顶点 V-U 中的 E:新边 (D,E) 权值 2 < 旧边 (B,E) 权值 3,**更新** lowcost[E]=2,closest[E]=D。
  * 检查顶点 V-U 中的 F:新边 (D,F) 权值 INF >= 旧边 (A,F) 权值 5,**不更新**。
  * 检查顶点 V-U 中的 G:新边 (D,G) 权值 INF >= 旧边 (B,G) 权值 4,**不更新**。
---------------------------------------------------------
  当前 V-U 集合中的候选边 (lowcost > 0 且 < INF):
    * 边 (C, B),权重: 7
    * 边 (E, D),权重: 2
    * 边 (F, A),权重: 5
    * 边 (G, B),权重: 4

--- 步骤 3.a: 查找 V-U 中 lowcost 最小的顶点 (min_cost 初始为 INF) ---
--- 查找完成:选取顶点 E,最小权重: 2 ---
--- 步骤 3.b: 更新 lowcost 和 closest (新加入顶点 E) ---
  * 检查顶点 V-U 中的 C:新边 (E,C) 权值 10 >= 旧边 (B,C) 权值 7,**不更新**。
  * 检查顶点 V-U 中的 F:新边 (E,F) 权值 INF >= 旧边 (A,F) 权值 5,**不更新**。
  * 检查顶点 V-U 中的 G:新边 (E,G) 权值 INF >= 旧边 (B,G) 权值 4,**不更新**。
---------------------------------------------------------
  当前 V-U 集合中的候选边 (lowcost > 0 且 < INF):
    * 边 (C, B),权重: 7
    * 边 (F, A),权重: 5
    * 边 (G, B),权重: 4

--- 步骤 4.a: 查找 V-U 中 lowcost 最小的顶点 (min_cost 初始为 INF) ---
--- 查找完成:选取顶点 G,最小权重: 4 ---
--- 步骤 4.b: 更新 lowcost 和 closest (新加入顶点 G) ---
  * 检查顶点 V-U 中的 C:新边 (G,C) 权值 6 < 旧边 (B,C) 权值 7,**更新** lowcost[C]=6,closest[C]=G。
  * 检查顶点 V-U 中的 F:新边 (G,F) 权值 1 < 旧边 (A,F) 权值 5,**更新** lowcost[F]=1,closest[F]=G。
---------------------------------------------------------
  当前 V-U 集合中的候选边 (lowcost > 0 且 < INF):
    * 边 (C, G),权重: 6
    * 边 (F, G),权重: 1

--- 步骤 5.a: 查找 V-U 中 lowcost 最小的顶点 (min_cost 初始为 INF) ---
--- 查找完成:选取顶点 F,最小权重: 1 ---
--- 步骤 5.b: 更新 lowcost 和 closest (新加入顶点 F) ---
  * 检查顶点 V-U 中的 C:新边 (F,C) 权值 INF >= 旧边 (G,C) 权值 6,**不更新**。
---------------------------------------------------------
  当前 V-U 集合中的候选边 (lowcost > 0 且 < INF):
    * 边 (C, G),权重: 6

--- 步骤 6.a: 查找 V-U 中 lowcost 最小的顶点 (min_cost 初始为 INF) ---
--- 查找完成:选取顶点 C,最小权重: 6 ---
--- 步骤 6.b: 更新 lowcost 和 closest (新加入顶点 C) ---
---------------------------------------------------------

-----------------------------------
最小生成树的总权重: 16
===================================