kuangbin_MST B (POJ 1287)

裸的模板题 因为直接用的邻接矩阵所以用最小值覆盖先前输入的重复边

#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
#define INF 0x3F3F3F3F
using namespace std;

typedef pair<int, int> pii;
struct cmp{
    bool operator () (const pii a, const pii b){
        return a.first > b.first;
    }
};

int n, m, val[60][60];

int prim(int s)
{
    int ans = 0, dist[60], vis[60];
    memset(dist, 0x3f, sizeof dist);
    memset(vis, false, sizeof vis);
    
    priority_queue<pii, vector<pii>, cmp> q;
    for(int i = 1; i <= n; i++){
        if(val[s][i] != INF){
            dist[i] = val[s][i];
            q.push(make_pair(dist[i], i));
        }
    }
    dist[s] = 0;
    vis[s] = true;
    while(!q.empty()){
        pii u = q.top();
        q.pop();
        if(vis[u.second]) continue;
        vis[u.second] = true;
        ans += u.first;
        for(int i = 1; i <= n; i++){
            if(!vis[i] && dist[i] > val[u.second][i]){
                dist[i] = val[u.second][i];
                q.push(make_pair(dist[i], i));
            }
        }
    }
    return ans;
}
int main()
{
    while(scanf("%d%d", &n, &m) == 2){
        int u, v, w;
        memset(val, 0x3f, sizeof val);
        while(m--){
            scanf("%d%d%d", &u, &v, &w);
            val[u][v] = val[v][u] = min(val[u][v], w);
        }
        printf("%d
", prim(1));
    }
    return 0;
}
原文地址:https://www.cnblogs.com/quasar/p/5144520.html