最小生成树kruskal算法的代码实现

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <iostream>

#include <algorithm>

#define maxn 105

using namespace std;

Int father[maxn], son[maxn];

Struct eage

{

Int a;

Int b;

Int eg;

}e[maxn];

Bool cmp(const eage & a, const eage & b)

{

Return a.eg < b.eg;

}

Int research(int a)

{

Return a == father[a] ? a : research(father[a]);

}

bool join(int a, int b)

{

Int root1, root2;

Root1 = research(a);

Root2 = research(a);

If(root1 == root2)

Return false;

Else if(son[root1] >= son[root2])

{

Father[root2] = root1;

Son[root1] += son[root2];

}

Else

{

Father[root1] = root2;

Son[root2] += son[root1];

}

Return true;

}

Int main()

{

Int i, n, en, nn = 0, ans = 0, flag = 0;

Scanf(“%d%d”,&n, &en);

For(i = 0;i < en;i++)

{

Scanf(“%d%d%d”,&e[i].a, &e[i].b, &e[i].eg);

}

Sort(e, e + en - 1, cmp);

For(i = 0;i < n;i++)

{

Father[i] = i;

Son[i] = 1;

}

For(i = 0;i < en;i++)

{

If(join(e[i].a, e[i].b))

{

Nn++;

Ans += e[i].eg;

}

If(nn == (n - 1)

{

Flag = 1;

Break;

}

}

If(flag == 1)

Printf(“%d\n”, ans);

Else

Printf(“impossible!\n”);

}

时间: 2024-10-23 08:49:57

最小生成树kruskal算法的代码实现的相关文章

ZOJ 1718 POJ 2031 Building a Space Station 修建空间站 最小生成树 Kruskal算法

题目链接:ZOJ 1718 POJ 2031 Building a Space Station 修建空间站 Building a Space Station Time Limit: 2 Seconds      Memory Limit: 65536 KB You are a member of the space station engineering team, and are assigned a task in the construction process of the statio

无向图最小生成树Kruskal算法

问题 最小生成树的Kruskal算法 描述:有A.B.C.D四个点,每两个点之间的距离(无方向)是(第一个数字是两点之间距离,后面两个字母代表两个点):(1,'A','B'),(5,'A','C'),(3,'A','D'),(4,'B','C'),(2,'B','D'),(1,'C','D') 生成边长和最小的树,也就是找出一种连接方法,将各点连接起来,并且各点之间的距离和最小. 思路说明: Kruskal算法是经典的无向图最小生成树解决方法.此处列举两种python的实现方法.这两种方法均参考

SOJ4339 Driving Range 最小生成树 kruskal算法

典型的最小生成树 然后求最大的一条边 附上链接 http://cstest.scu.edu.cn/soj/problem.action?id=4339 需要注意的是有可能有 "IMPOSSIBLE" 的情况 这里用一个flag标记 记录所并的节点 只有flag = n时才能成功 负责就 "IMPOSSIBLE" 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring&g

最小生成树 kruskal算法简介

生成树--在一个图中的一个联通子图  使得所有的节点都被(访问) 最小生成树 (MST) 即联通子图的总代价(路程)最小 已知的一个图 有n个点 m条边 kruskal的算法如下 先对边从小到大排序 从最小的边起,不停的合并这条边的两个节点到一个集合,如果这条边的两个节点已经在一个集合里,则无视,否则形成回路(显然错误)直到所有的节点并到一个集合里 这里需要用到并查集来合并节点 1 int cmp(const int i,const int j) { 2 return w[i] < w[j];

最小生成树 Kruskal算法

Kruskal算法 1.概览 Kruskal算法是一种用来寻找最小生成树的算法,由Joseph Kruskal在1956年发表.用来解决同样问题的还有Prim算法和Boruvka算法等.三种算法都是贪婪算法的应用.和Boruvka算法不同的地方是,Kruskal算法在图中存在相同权值的边时也有效. 2.算法简单描述 1).记Graph中有v个顶点,e个边 2).新建图Graphnew,Graphnew中拥有原图中相同的e个顶点,但没有边 3).将原图Graph中所有e个边按权值从小到大排序 4)

最小生成树Kruskal算法的提出者Joseph Bernard Kruskal,Jr.

熟悉算法中的最小生成树的朋友都晓得有一个Kruskal算法,这个算法就是由题目中那个名字很长的人提出的.因为他功绩卓越,尊称他为Kruskal. Kruskal生于1928年1月29日,卒于2010年9月19日,美国人,维基里的词条中包含的头衔是:数学家.统计学家.计算机科学家.心理测量学专家. kruskal分别就读过芝加哥大学和普林斯顿大学,1954年获得博士学位. 下面链接中是一篇几年他的文章,从中可以了解他的更多成就.顺便说一句,他的父母和兄弟也都很牛. http://pan.baidu

并查集扩展之最小生成树Kruskal算法

并查集有很多经典的应用.在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中. 其中一个非常经典的应用是最小生成树的Kruskal算法.给定一个具有n个节点的连通图,它的生成树是原图的一个子图,包含所有n个节点,且有保持图连通的最少的边(n-1条边).边权值最小的生成树是最小生成树. kruskal算法是一个贪心算法,把所有的边按权值从小到大依次考虑,如果当前边加进生成树中会出现回路

数据结构:最小生成树--Kruskal算法

Kruskal算法 Kruskal算法 求解最小生成树的还有一种常见算法是Kruskal算法.它比Prim算法更直观.从直观上看,Kruskal算法的做法是:每次都从剩余边中选取权值最小的,当然,这条边不能使已有的边产生回路. 手动求解会发现Kruskal算法异常简单,以下是一个样例 先对边的权值排个序:1(0,1) 2(2,6) 4(1,3) 6(1,2) 8(3,6) 10(5,6) 12(3,5) 15(4,5) 20(0,1) 首选边1(0,1).2(2,6).4(1,3).6(1,2)

最小生成树Kruskal算法+并查集实现

今天刚掌握Kruskal算法,写下随笔. 对于稀疏图来说,用Kruskal写最小生成树效率更好,加上并查集,可对其进行优化. Kruskal算法的步骤: 1.对所有边进行从小到大的排序. 2.每次选一条边(最小的边),如果如果形成环,就不加入(u,v)中,否则加入.那么加入的(u,v)一定是最佳的. 并查集: 我们可以把每个连通分量看成一个集合,该集合包含了连通分量的所有点.而具体的连通方式无关紧要,好比集合中的元素没有先后顺序之分,只有"属于"与"不属于"的区别.