最小生成树-Prim

本文介绍了一种使用Prim算法求解最小生成树(MST)的方法,并提供了完整的C++实现代码。该算法从一个顶点开始,逐步选择最短边加入生成树中,直至包含所有顶点。适用于解决图论中的连通性和优化问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <bits/stdc++.h>
#define INF (1 << 30)
using namespace std;

int t, n, m, x, y, sum, cnt, t1, t2, t3, flag;
int mp[10005][10005], vis[10005], dis[10005];
void Prim() {
    for(int i = 1; i <= n; i++) {
        dis[i] = mp[1][i];
    }
    memset(vis, 0, sizeof(vis));
    sum = cnt = 0;
    vis[1] = 1;
    cnt++;
    for(int i = 2; i <= n; i++) {
        int mindis = INF, k;
        for(int j = 1; j <= n; j++) {
            if(!vis[j] && dis[j] < mindis) {
                mindis = dis[j];
                k = j;
            }
        }
        if(mindis == INF) {
            flag = 1;
            return;
        }
        vis[k] = 1;
        sum += mindis;
        for(int j = 1; j <= n; j++) {
            if(!vis[j] && dis[j] > mp[k][j]) {
                dis[j] = mp[k][j];
            }
        }
    }
}
int main() {
    while(~scanf("%d%d", &n, &m)) {
        //初始化
        for(int i = 1; i <= n; i++) {
            for(int j = 1; j <= n; j++) {
                if(i == j) {
                    mp[i][j] = 0;
                } else {
                    mp[i][j] = INF;
                }
            }
        }
        //读入边
        for(int i = 1; i <= m; i++) {
            scanf("%d%d%d", &t1, &t2, &t3);
            if(t3 < mp[t1][t2]) {
                mp[t1][t2] = mp[t2][t1] = t3;
            }
        }
        //初始化dis数组
        flag = 0;
        Prim();
        if(!flag) {
            printf("%d\n", sum);
        } else {
            printf("-1\n");
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值