【MST最小生成树】Prim(普里姆)算法

Prim算法详解请见:CSDN

不过还要考虑重边,害我在洛谷的模板题里错了一次

#include <bits/stdc++.h>
#define MAX 5005
#define INF (int)1e8
using namespace std;

int g[MAX][MAX];
int n,m;

int prim(){
    int lowcost[MAX]; //各点到原点的最小距离
    int mst[MAX];//边<mst[i], i>是最小生成树的一条边,若mst[i]==0,说明i已经加入到最小生成树中
    for (int i = 0; i <= n; ++i) {
        lowcost[i] = g[1][i];
        mst[i] = 1;
    }
    lowcost[1] = 0;
    mst[1] = 0;
    int min,minid;
    int sum = 0;
    for (int i = 2; i <= n; ++i) {
        min = INF;
        minid = 0;
        for (int j = 2; j <= n; ++j) {
            if(lowcost[j] < min && lowcost[j] != 0){
                min = lowcost[j];
                minid = j;
            }
        }
        if(min == INF)
            return -1;

        sum += min;
        lowcost[minid] = 0;

        for (int j = 2; j <= n; ++j) {
            if(g[minid][j] < lowcost[j]){
                lowcost[j] = g[minid][j];
                mst[j] = minid;
            }
        }
    }
    return sum;
}

int main()
{
    cin >> n >> m;
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= n; ++j) {
            g[i][j] = INF;
        }
    }
    int x,y,w;
    for (int i = 0; i < m; ++i) {
        scanf("%d %d %d", &x, &y, &w);
        g[x][y] = min(g[x][y], w); //注意重边!!!
        g[y][x] = g[x][y];
    }
    int ans = prim();
    if(ans == -1)
        cout << "orz" << endl;
    else
        cout << ans << endl;

    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_30115697/article/details/81839270
今日推荐