HackerRank "Kruskal (MST): Really Special Subtree"

Kruskal Algorithm is based on Union-Find - quite intuitive.

#include <vector>
#include <iostream>
#include <queue>
#include <unordered_map>
#include <unordered_set>
using namespace std;

struct Edge
{
    Edge() :s(0), t(0), d(0) {}
    Edge(unsigned rs, unsigned rt, unsigned rd) : s(rs), t(rt), d(rd) {}

    unsigned s;
    unsigned t;
    unsigned d;

    bool operator()(const Edge &e1, const Edge &e2)
    {
        if (e1.d != e2.d)    return e1.d > e2.d;
        return (e1.s + e1.d + e1.t) > (e2.s + e2.d + e2.t);
    }
};

//    Union-Set
unordered_map<unsigned, unsigned> pm; // smaller as parent
unsigned get_union_id(unsigned id)
{
    if (pm.find(id) == pm.end())
    {
        pm[id] = id;
        return id;
    }

    unsigned ret = id;
    while(ret != pm[ret]) ret = pm[ret];
    return ret;
}

void union_2id(unsigned id0, unsigned id1)
{
    unsigned p0 = get_union_id(id0);
    unsigned p1 = get_union_id(id1);

    if(p0 < p1)         pm[p1] = id0;
    else if(p0 > p1)     pm[p0] = id1;
}
//////////////////////////////////////

int main()
{
    long n, m; cin >> n >> m;

    priority_queue<Edge, vector<Edge>, Edge> q, qs;

    //    from -> to -> length
    unordered_map<unsigned, unordered_map<unsigned, unsigned>> g;
    for (int i = 0; i < m; i++)
    {
        unsigned a, b, d; cin >> a >> b >> d;
        q.push(Edge(min(a,b), max(a,b), d));
        g[a][b] = g[b][a] = d;
    }

    unsigned long long ret = 0;

    //    Step 1
    unsigned s; cin >> s;
    for (auto &kv : g[s])
    {
        unsigned a = s;
        unsigned b = kv.first;
        qs.push(Edge(min(a, b), max(a, b), kv.second));
    }
    //    pick first
    const Edge &first = qs.top();
    ret += first.d;
    union_2id(first.s, first.t);

    while (!q.empty())
    {
        Edge picked = q.top(); q.pop();

        if (get_union_id(picked.s) == get_union_id(picked.t)) continue;
        union_2id(picked.s, picked.t);

        ret += picked.d;
    }
    cout << ret << endl;
    return 0;
}
时间: 2024-08-29 15:53:19

HackerRank "Kruskal (MST): Really Special Subtree"的相关文章

HackerRank &quot;Prim&#39;s (MST) : Special Subtree&quot;

An intuitive Prim algorithm impl. #include <vector> #include <iostream> #include <queue> #include <unordered_map> #include <unordered_set> using namespace std; struct Edge { Edge() :s(0), t(0), d(0) {} Edge(unsigned rs, unsig

蓝桥杯训练 安慰奶牛 (Kruskal MST)

算法训练 安慰奶牛 时间限制:1.0s   内存限制:256.0MB 问题描述 Farmer John变得非常懒,他不想再继续维护供奶牛之间供通行的道路.道路被用来连接N个牧场,牧场被连续地编号为1到N.每一个牧场都是一个奶牛的家.FJ计划除去P条道路中尽可能多的道路,但是还要保持牧场之间 的连通性.你首先要决定那些道路是需要保留的N-1条道路.第j条双向道路连接了牧场Sj和Ej(1 <= Sj <= N; 1 <= Ej <= N; Sj != Ej),而且走完它需要Lj的时间.

POJ1679 The Unique MST【Kruskal】【次小生成树】

The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 21304 Accepted: 7537 Description Given a connected undirected graph, tell if its minimum spanning tree is unique. Definition 1 (Spanning Tree): Consider a connected, undirected

HUTACM2016 MST练习&#183;解题报告

专题链接 A - 还是畅通工程 题解: n个村,m条路,要用最少的钱把所有村连接起来,MST的模板题,提供两种算法模板. //使用Kruskal算法 #include<stdio.h> #include<algorithm> #include<string.h> using namespace std; const int N = 105; int seed[N]; //构建并查集 int find_root(int x){ return seed[x] < 0?

POJ——T1679 The Unique MST

http://poj.org/problem?id=1679 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 30120   Accepted: 10778 Description Given a connected undirected graph, tell if its minimum spanning tree is unique. Definition 1 (Spanning Tree): Consider a

次小生成树【模板】

给一个图,判断图的最小生成树是否唯一. End[]记录邻接表尾节点的位置.MST表示最小生成树的大小,SecMST表示次小生成树的大小. #include<iostream> #include<algorithm> #include<cstdio> #include<cstring> using namespace std; const int MAXN = 1010; const int MAXM = 100010; int father[MAXN]; i

POJ 1679:The Unique MST(次小生成树&amp;&amp;Kruskal)

The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 19941   Accepted: 6999 Description Given a connected undirected graph, tell if its minimum spanning tree is unique. Definition 1 (Spanning Tree): Consider a connected, undire

uva 3592 (MST, kruskal)

题意:平面上有若干个点,求最小生成树.有最多8个套餐,每个套餐有一个价格和若干个点,一旦购买套餐内的点就会相互连通. 思路:由于套餐不是很多,所以枚举一下即可,然后最小生成树就行了. 代码如下: 1 /************************************************** 2 * Author : xiaohao Z 3 * Blog : http://www.cnblogs.com/shu-xiaohao/ 4 * Last modified : 2014-06-

POJ 1679:The Unique MST(次小生成树&amp;amp;&amp;amp;Kruskal)

The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 19941   Accepted: 6999 Description Given a connected undirected graph, tell if its minimum spanning tree is unique. Definition 1 (Spanning Tree): Consider a connected, undire