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(), t(), d() {}
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 = ; 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 = ; // 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 ;
}

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

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

    An intuitive Prim algorithm impl. #include <vector> #include <iostream> #include <que ...

  2. The Unique MST(次小生成树)

    Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 22335   Accepted: 7922 Description Give ...

  3. Kruskal最小生成树

    并查集+kruskal==>MST 效率很低 #include <iostream> using namespace std; #define MAX 105 //自己设置最大值 / ...

  4. [NOIP2013提高组] CODEVS 3287 火车运输(MST+LCA)

    一开始觉得是网络流..仔细一看应该是最短路,再看数据范围..呵呵不会写...这道题是最大生成树+最近公共祖先.第一次写..表示各种乱.. 因为要求运输货物质量最大,所以路径一定是在最大生成树上的.然后 ...

  5. 最小生成树问题:Kruskal算法 AND Prim算法

    Kruskal算法: void Kruskal ( ) {     MST = { } ;                           //边的集合,最初为空集     while( Edge ...

  6. POJ——T1679 The Unique MST

    http://poj.org/problem?id=1679 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 30120   ...

  7. Algorithms & Data structures in C++& GO ( Lock Free Queue)

    https://github.com/xtaci/algorithms //已实现 ( Implemented ): Array shuffle https://github.com/xtaci/al ...

  8. CCF-CSP题解 201812-4 数据中心

    题目要求最长边最小的生成树.好吧,这就是一道kruskal MST题. #include <bits/stdc++.h> const int maxn = 50000; const int ...

  9. NetworkX系列教程(10)-算法之二:最小/大生成树问题

    小书匠 Graph 图论  重头戏部分来了,写到这里我感觉得仔细认真点了,可能在NetworkX中,实现某些算法就一句话的事,但是这个算法是做什么的,用在什么地方,原理是怎么样的,不清除,所以,我决定 ...

随机推荐

  1. 用python的BeautifulSoup分析html 【转】

    原地址:http://www.cnblogs.com/twinsclover/archive/2012/04/26/2471704.html 序言 之前用python爬取网页的时候,一直用的是rege ...

  2. ARM汇编程序基本知识

    ARM汇编程序基本知识 1.汇编程序的基本组成 ARM汇编语言程序中,程序是以程序段为单位组织代码的.段是相对独立的指令或者代码序列,拥有特定的名称.段的种类有代码段.数据段和通用段,代 码段的内容为 ...

  3. iOS 视图控制器转场详解

    iOS 视图控制器转场详解 前言的前言 唐巧前辈在微信公众号「iOSDevTips」以及其博客上推送了我的文章后,我的 Github 各项指标有了大幅度的增长,多谢唐巧前辈的推荐.有些人问我相关的问题 ...

  4. 【堆栈应用一】一个数divided=几个最小质因数的乘积(时间复杂度On)

    此算法由LQD提供

  5. MVC发布问题(一直显示目录浏览)

    写了一个MVC的Demo,发布之后一直显示目录浏览,始终无法展示网站. 步骤如下: 1.生成解决方案,发布应用程序 2.打开IIS,新建网站,选择发布程序的代码路径 3.设置应用程序池为4.0,集成 ...

  6. oracle sql

    show user desc 'table' SELECT DISTINCT SELECT * FROM emp WHERE comm is NOT NULL; SELECT * FROM emp W ...

  7. iOS开发UI篇—Button基础

    iOS开发UI篇—Button基础 一.简单说明 一般情况下,点击某个控件后,会做出相应反应的都是按钮 按钮的功能比较多,既能显示文字,又能显示图片,还能随时调整内部图片和文字的位置 二.按钮的三种状 ...

  8. [最近公共祖先] POJ 1330 Nearest Common Ancestors

    Nearest Common Ancestors Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 27316   Accept ...

  9. Quartz Spring与Spring Task总结

    Spring对Quartz作了一个封装,同时,Spring自己也提供了一个任务定时器(spring-task),现把它总结一下.    对于Quartz,我们使用的时候主要是注重两个方面,一个是定时任 ...

  10. CodeForces 360E Levko and Game(Codeforces Round #210 (Div. 1))

    题意:有一些无向边m条权值是给定的k条权值在[l,r]区间可以由你来定,一个点s1 出发一个从s2出发  问s1 出发的能不能先打到f 思路:最短路. 首先检测能不能赢 在更新的时候  如果对于一条边 ...