zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    C++ *和&
    leetcode 338. Bit位计数
    leetcode 216. 组合总和 III
    leetcode 40. 组合总和 II
    c++ vector 常用函数
    leetcode 491. 递增子序列
    leetcode 441. 排列硬币
    leetcode 258. 各位相加
    leetcode 415. 字符串相加
    leetcode 67. 二进制求和
  • 原文地址:https://www.cnblogs.com/quasar/p/5144520.html
Copyright © 2011-2022 走看看