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

推荐订阅源

G
Google Developers Blog
T
Troy Hunt's Blog
博客园 - 【当耐特】
N
Netflix TechBlog - Medium
V
V2EX
I
InfoQ
量子位
Hugging Face - Blog
Hugging Face - Blog
The Register - Security
The Register - Security
J
Java Code Geeks
V
Visual Studio Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
S
Security @ Cisco Blogs
爱范儿
爱范儿
Hacker News: Ask HN
Hacker News: Ask HN
Recent Commits to openclaw:main
Recent Commits to openclaw:main
B
Blog
Apple Machine Learning Research
Apple Machine Learning Research
V2EX - 技术
V2EX - 技术
罗磊的独立博客
S
Security Affairs
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
IT之家
IT之家
O
OpenAI News
W
WeLiveSecurity
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
GbyAI
GbyAI
The Hacker News
The Hacker News
Attack and Defense Labs
Attack and Defense Labs
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Microsoft Azure Blog
Microsoft Azure Blog
F
Fortinet All Blogs
Schneier on Security
Schneier on Security
雷峰网
雷峰网
Scott Helme
Scott Helme
B
Blog RSS Feed
有赞技术团队
有赞技术团队
Recent Announcements
Recent Announcements
L
LangChain Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Y
Y Combinator Blog
Help Net Security
Help Net Security
NISL@THU
NISL@THU
A
About on SuperTechFans
L
LINUX DO - 最新话题
博客园 - 司徒正美
博客园 - 聂微东
博客园 - 三生石上(FineUI控件)
Spread Privacy
Spread Privacy
P
Proofpoint News Feed

博客园 - 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
===================================