用普里姆(Prim)算法求解最小生成树——C语言(案例实现)

用普里姆(Prim)算法求解最小生成树原理

假设 N = ( P , E ) N=(P,{E}) N=(P,E)是连通网, T E TE TE N N N上最小生成树中的边集合。算法从 U = U 0 ( U 0 ∈ V ) , T E = { } U={U_{0}}(U_{0} \in V),TE = \{\} U=U0(U0V),TE={ }开始,重复执行下述操作:在所有的 u u u ∈ \in U U U, v v

  • 7
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
普里Prim算法是一种用于求解最小生成的贪心算法。下面是使用C语言实现普里算法的示例代码: ```c #include <stdio.h> #include <stdbool.h> #define INF 0x3f3f3f3f #define MAX_N 100 int n; // 点的数量 int m[MAX_N][MAX_N]; // 图的邻接矩阵 int dis[MAX_N]; // 到集合S的最短距离 bool vis[MAX_N]; // 是否已经加入集合S void prim() { // 初始化 for (int i = 0; i < n; i++) { dis[i] = INF; vis[i] = false; } dis[0] = 0; // 从第一个点开始构建最小生成 // 构建最小生成 for (int i = 0; i < n; i++) { int u = -1, min_dis = INF; for (int j = 0; j < n; j++) { if (!vis[j] && dis[j] < min_dis) { u = j; min_dis = dis[j]; } } if (u == -1) break; // 无法继续扩展最小生成 vis[u] = true; for (int v = 0; v < n; v++) { if (!vis[v] && m[u][v] < dis[v]) { dis[v] = m[u][v]; } } } } int main() { scanf("%d", &n); // 读入图的邻接矩阵 for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { scanf("%d", &m[i][j]); } } prim(); // 求解最小生成 // 输出最小生成的边权之和 int sum = 0; for (int i = 0; i < n; i++) { sum += dis[i]; } printf("%d\n", sum); return 0; } ``` 上述代码中,`m`是图的邻接矩阵,`dis`是到集合S的最短距离,`vis`表示是否已经加入集合S。`prim`函数首先进行初始化,然后从第一个点开始构建最小生成。每次找到距离集合S最近的点u,将其加入集合S,并更新其相邻的点v到集合S的最短距离。最后输出最小生成的边权之和即可。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值