HackerRank "Prim's (MST) : Special Subtree"

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, unsigned rt, unsigned rd) :
        s(rs), t(rt), d(rd) {}

    unsigned s;
    unsigned t;
    unsigned d;

    bool operator()(const Edge &e1, const Edge &e2)
    {
        return e1.d > e2.d;
    }
};

int main()
{
    long n, m; cin >> n >> m;
    //    from -> to -> (length, id)
    unordered_map<unsigned, unordered_map<unsigned, unsigned>> g;
    for (int i = 0; i < m; i++)
    {
        unsigned a, b, d; cin >> a >> b >> d;
        g[a][b] = g[b][a] = d;
    }
    unsigned s; cin >> s;

    unordered_set<unsigned> pickedSet; // linked node inx

    priority_queue<Edge, vector<Edge>, Edge> q;
    for (auto &kv : g[s])
    {
        q.push(Edge(s, kv.first, kv.second));
    }
    pickedSet.insert(s);

    unsigned long long ret = 0;
    while (!q.empty())
    {
        Edge picked = q.top();
        q.pop();
        if (pickedSet.count(picked.t)) continue;

        pickedSet.insert(picked.t);

        // add new choices
        for (auto &kv : g[picked.t])
        {
            q.push(Edge(picked.t, kv.first, kv.second));
        }

        ret += picked.d;
    }
    cout << ret << endl;
    return 0;
}

HackerRank "Prim's (MST) : Special Subtree"

时间: 2024-08-30 06:23:02

HackerRank "Prim's (MST) : Special Subtree"的相关文章

HackerRank &quot;Kruskal (MST): Really Special Subtree&quot;

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)

最优比例生成树模板

/* 01最优(小)比例生成树 求最大比例更改prim即可 poj2728 将图中点连成一棵树满足 总花费/总长度 最小 */ int n,m; double d[1005],cost[1005],ben[1005]; double pic[1005][1005]; ///两点间距离 double cpic[1005][1005]; ///两点间花费 int vis[1005]; int pre[1005]; ///记录父节点 struct Node{ int x,y,h; double ans

HDU 4756 Install Air Conditioning

Install Air Conditioning Time Limit: 2000ms Memory Limit: 65535KB This problem will be judged on HDU. Original ID: 475664-bit integer IO format: %I64d      Java class name: Main   NJUST carries on the tradition of HaJunGong. NJUST, who keeps up the ”

HDU - 1233 还是畅通工程(最小生成树)

d.n个村庄,n*(n-1)/2条路,铺设若干条路,使任何两个村庄都可达.求最小的公路总长度. s.最小生成树 c.Prim算法:cost[a][b]和cost[b][a]都得赋值. /* Prim算法 Prim求MST 耗费矩阵cost[][],标号从0开始,0~n-1 返回最小生成树的权值,返回-1表示原图不连通 */ #include<iostream> #include<stdio.h> #include<string.h> using namespace st

数据结构图的常用算法总结

本人在校期间写了一个win32应用程序,用于回顾算法导论图的常用算法(图中边的权值为两个圆心的像素点的距离) 1.dijkstra算法求两点之间最短路径: 贪心算法用优先队列实现,每次选择距离起点路径和最短的顶点弹出队列,此顶点最短路径就已经确定 初始图如下 选择起点如W 选择终点如下: 显示路线: 1) 2) 3) 4) 打开数据,第一行为W距离S点距离,剩下为边的距离一遍参考 470 A <-> D 120 D <-> C 71 C <-> E 93 E <-

HDU 1102 Constructing Roads (最小生成树)

最小生成树模板(嗯……在kuangbin模板里面抄的……) 最小生成树(prim) /** Prim求MST * 耗费矩阵cost[][],标号从0开始,0~n-1 * 返回最小生成树的权值,返回-1表示原图不连通 */ const int INF = 0x3f3f3f3f; const int MAXN = 110; bool vis[MAXN]; int lowc[MAXN]; int map[MAXN][MAXN]; int Prim(int cost[][MAXN], int n) {

数据结构图的经常使用算法总结

本人在校期间写了一个win32应用程序,用于回想算法导论图的经常使用算法(图中边的权值为两个圆心的像素点的距离) 1.dijkstra算法求两点之间最短路径: 贪心算法用优先队列实现,每次选择距离起点路径和最短的顶点弹出队列,此顶点最短路径就已经确定 初始图例如以下 选择起点如W 选择终点例如以下: 显示路线: 1) 2) 3) 4) 打开数据,第一行为W距离S点距离.剩下为边的距离一遍參考 470 A <-> D 120 D <-> C 71 C <-> E 93 E

hdu 4081 次小生成树

简单说下思想(这里引用自http://blog.csdn.net/jarily/article/details/8883858) /* *算法引入: *设G=(V,E,w)是连通的无向图,T是图G的一棵最小生成树; *如果有另一棵树T1,满足不存在树T',ω(T')<ω(T1),则称T1是图G的次小生成树; * *算法思想: *邻集的概念:由T进行一次可行交换得到的新的生成树所组成的集合,称为树T的邻集,记为N(T); *设T是图G的最小生成树,如果T1满足ω(T1)=min{ω(T')|T'∈

HDU - 1879 继续畅通工程(最小生成树)

d.n个村庄,n*(n-1)/2条路,建立一些路使所有村庄可达.求建立路这些路的最小花费. s.最小生成树 c.Prim算法:cost[a][b]和cost[b][a]都得赋值. /* Prim算法 Prim求MST 耗费矩阵cost[][],标号从0开始,0~n-1 返回最小生成树的权值,返回-1表示原图不连通 */ #include<iostream> #include<stdio.h> #include<string.h> using namespace std;