提高篇 第三部分 图论 第1章 最小生成树

最小生成树

最小生成树_百度百科

几分钟搞明白生成树和最小生成树的定义

几分钟搞明白生成树和最小生成树的定义_听老罗娓娓道来-CSDN博客_生成树的定义

最小生成树---Prim算法和Kruskal算法

最小生成树---Prim算法和Kruskal算法 - 水火379 - 博客园

最小生成树的两种算法

最小生成树的两种算法 - 龙腾四海365 - 博客园

22. 图(4):最小生成树

22. 图(4):最小生成树_dugudaibo的博客-CSDN博客_最小生成树怎么画

最小生成树之克鲁斯卡尔(Kruskal)算法

最小生成树之克鲁斯卡尔(Kruskal)算法 - gaoyanliang - 博客园

最小生成树的两种方法(Kruskal算法和Prim算法)

最小生成树的两种方法(Kruskal算法和Prim算法)_a2392008643的博客-CSDN博客_最小生成树

最小生成树:Prim算法

最小生成树:Prim算法_大力海棠的博客-CSDN博客_prim算法能不能形成回路

P3366 【模板】最小生成树

【模板】最小生成树 - 洛谷

算法_最小生成树

算法_最小生成树 - hlhdidi - 博客园

普利姆算法(prim)求最小生成树(MST)过程详解

https://jingyan.baidu.com/article/9113f81b6707c52b3214c794.html

图的最小生成树 - MATLAB minspantree- MathWorks 中国

如下的无向图中有多少个不同的最小生成树( )__牛客网



1487:【例 2】北极通讯网络

信息学奥赛一本通(C++版)在线评测系统

#10065. 「一本通 3.1 例 2」北极通讯网络 - jiansong! - 博客园

LOJ#10065. 「一本通 3.1 例 2」北极通讯网络 - MXR_alone - 博客园

1487:【例 2】北极通讯网络_叶上初阳_285557的博客-CSDN博客



1488:新的开始

信息学奥赛一本通(C++版)在线评测系统

1488:新的开始_sigd的博客-CSDN博客



1489:构造完全图

信息学奥赛一本通(C++版)在线评测系统

Loj10067 构造完全图 - Dijkstra·Liu - 博客园

【并查集】构造完全图_skysys的研究小屋 -CSDN博客_构造完全图

图论-生成树-构造完全图_一般来说,置顶的才值得看。-CSDN博客



1490:秘密的牛奶运输

信息学奥赛一本通(C++版)在线评测系统

2018.09.15 秘密的牛奶管道SECRET(次小生成树)_苟为蒟蒻又何妨-CSDN博客

https://blog.csdn.net/weixin_44574520/article/details/96346115

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
最小生成树是一种常见的图论算法,用于在一个加权连通图中找到最小的生成树。以下是使用C语言实现最小生成树的基本步骤: 1. 定义一个结构体来表示图中的边,包括起点、终点和权重。 2. 创建一个邻接矩阵或邻接表来表示图。 3. 从任意一个顶点开始,遍历整个图,并将遍历到的边按照权重从小到大排序。 4. 使用并查集来判断当前遍历到的边是否会形成环,如果不会,则将该边加入到最小生成树中。 5. 重复步骤3和4,直到所有的顶点都被遍历到或者最小生成树中已经包含了所有的顶点。 6. 最后得到的最小生成树即为原图的最小生成树。 下面是一个简单的C语言实现最小生成树的例子: ```c #include <stdio.h> #include <stdlib.h> #define MAX_VERTEX_NUM 100 // 边的结构体 typedef struct { int start; int end; int weight; } Edge; // 并查集的结构体 typedef struct { int parent[MAX_VERTEX_NUM]; int rank[MAX_VERTEX_NUM]; } UnionFind; // 初始化并查集 void makeSet(UnionFind *uf, int n) { for (int i = 0; i < n; i++) { uf->parent[i] = i; uf->rank[i] = 0; } } // 查找根节点 int find(UnionFind *uf, int x) { if (uf->parent[x] != x) { uf->parent[x] = find(uf, uf->parent[x]); } return uf->parent[x]; } // 合并两个节点 void Union(UnionFind *uf, int x, int y) { int rootX = find(uf, x); int rootY = find(uf, y); if (rootX != rootY) { if (uf->rank[rootX] > uf->rank[rootY]) { uf->parent[rootY] = rootX; } else if (uf->rank[rootX] < uf->rank[rootY]) { uf->parent[rootX] = rootY; } else { uf->parent[rootY] = rootX; uf->rank[rootX]++; } } } // 按照权重从小到大排序 int compare(const void *a, const void *b) { Edge *edge1 = (Edge *)a; Edge *edge2 = (Edge *)b; return edge1->weight - edge2->weight; } // Kruskal算法 void kruskal(Edge *edges, int n, int m) { UnionFind uf; makeSet(&uf, n); int count = 0; for (int i = 0; i < m; i++) { int start = edges[i].start; int end = edges[i].end; if (find(&uf, start) != find(&uf, end)) { printf("%d %d %d\n", start, end, edges[i].weight); Union(&uf, start, end); count++; } if (count == n - 1) { break; } } } int main() { int n, m; scanf("%d %d", &n, &m); Edge edges[m]; for (int i = 0; i < m; i++) { scanf("%d %d %d", &edges[i].start, &edges[i].end, &edges[i].weight); } qsort(edges, m, sizeof(Edge), compare); kruskal(edges, n, m); return 0; } ``` 输入格式为:第一行有两个整数n和m,表示图中有n个顶点和m条边;接下来m行,每行包括三个整数a、b和c,表示a和b之间有一条权重为c的边。输出为最小生成树的边。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

dllglvzhenfeng

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

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

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

打赏作者

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

抵扣说明:

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

余额充值