hiho 27 最小生成树二·Kruscal算法
来源:互联网 发布:巴枪中通数据采集系统 编辑:程序博客网 时间:2024/06/13 07:39
问题描述
Kruscal算法同单源最短路径中的SPFA算法,都是只与边有关的,因此适合求解稀疏图。
算法描述
prime算法中有一个结论:对于城市i(i≠1),如果i与城市1的距离不超过其他任何城市j(j≠1)与城市1的距离,那么(1, i)这一条边一定存在于某一棵最小生成树中么?”
可以证明图中最短的边是属于最小生成树的,然后将最短边相连的两个顶点看做一个顶点,再找图中最短的边,依次类推进行N-1次就可以找到整棵树。
我们可以在开始时就讲图中的边排序,从小到大依次将边加入,只需要判断新加入的边链接的两个节点之前没有联通。可以使用并查集实现。这样算法复杂度为排序复杂度O(vlogv + v);
#include <algorithm>#include <vector>#include <cstdio>using namespace std;enum {maxn = 1000000+4};int f[maxn];int findF(int i){return i==f[i]? i: f[i] = findF(f[i]);}struct Edge{ int a, b; int w; bool operator<(const struct Edge& e)const{ return this->w < e.w; }};Edge G[maxn];int N, M;int main(){ freopen("in.txt", "r", stdin); scanf("%d %d", &N, &M); for (int i=0; i<=N; i++) f[i] = i; for (int i=0; i< M; i++) { scanf("%d %d %d", &G[i].a, &G[i].b, &G[i].w); } sort(G, G+M); int cnt =0; int all = 0; for (int i=0; cnt < N-1 && i< M; i++) { if(findF(G[i].a) != findF(G[i].b)) { all+= G[i].w; cnt++; f[f[G[i].a]] = f[G[i].b]; } } printf("%d\n", all); return 0;}
0 0
- hiho 27 最小生成树二·Kruscal算法
- HIHO #1098 : 最小生成树二·Kruscal算法
- hiho 最小生成树二(Kruscal算法)
- hihoCoder - hiho一下 第二十七周 - A - 最小生成树二·Kruscal算法
- hiho一下 第二十七周:最小生成树二·Kruscal算法
- hiho刷题日记——第二十七天最小生成树二·Kruscal算法
- hihoCoder 1098 : 最小生成树二·Kruscal算法
- #1098 : 最小生成树二·Kruscal算法
- #1098 : 最小生成树二·Kruscal算法
- hihocdoer 1098_最小生成树二·Kruscal算法
- #1098 : 最小生成树二·Kruscal算法
- [HihoCoder]#1098 : 最小生成树二·Kruscal算法
- hihoCoder 1098 最小生成树二·Kruscal算法
- hihocoder 最小生成树二·Kruscal算法
- hiho1098 : 最小生成树·Kruscal算法
- kruscal最小生成树算法
- 最小生成树-Kruscal算法
- hihoCoer 1098 : 最小生成树二·Kruscal算法 (并查集)
- hdu 2050
- magento 本地后台登录不了,前台不能登陆
- Smarty模板引擎的使用
- Python 高级特性之 map( )
- PPAPI中使用Chromium的3D图形接口
- hiho 27 最小生成树二·Kruscal算法
- myEclipse出现An internal error occurred during...的解决方案
- UIView的layoutSubviews和drawRect方法何时调用
- objdump反汇编用法示例
- 【poj 1451】T9 (字典树+深搜)
- HDOJ 2032 杨辉三角
- servlet生命周期
- c++ 几种内存约束
- swift 闭包