Kruskal算法(最小生成树)

Kruskal算法:首先按照边的权值进行从小到大排序,每次从剩余的边中选择权值最小的边且不会产生回路的边加入到生成树中,直到加入n-1条边就结束;

算法难点在与如何判断是否会产生回路。这个可以通过并查集实现,将所有加入生成树的结点加入同一个集合;

代码:

#include <string.h>
#include<iostream>
#include<vector>
#include<queue>
#include <algorithm>
using namespace std;
struct edge{//边的结构
    int u;
    int v;
    int w;
}e[100];
int f[100];//并查集数组
bool compare(struct edge a,struct edge b){//sort函数的比较器,实现边权从小到达排序
    return a.w<=b.w;
}
int getF(int x){//查找结点的根
    if(f[x]==x) return x;
    else {
        f[x]=getF(f[x]);//直接连接到根结点,实现路径压缩
        return f[x];
    }
}
bool unity(int a,int b){//联合所有加入生成树的结点
    int f1=getF(a);
    int f2=getF(b);
    if(f1!=f2){
        f[f1]=f2;
        return true;
    }
    return false;
}

int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=0;i<m;i++){//输入边信息
        cin>>e[i].u>>e[i].v>>e[i].w;
    }
    for(int i=0;i<100;i++){//初始化并查集
        f[i]=i;
    }
    sort(e,e+m,compare);//排序
    int munber=0,sum=0;
    for(int i=0;i<m;i++){//从小到大检测每一个结点是否可以加入生成树
        if(unity(e[i].u,e[i].v)){
            munber++;
            sum+=e[i].w;
        }
        if(munber==n-1) break;//当加入n-1条边,就可以结束
    }
    cout<<sum<<endl;
    return 0;
}

原文地址:https://www.cnblogs.com/zdl2234/p/10360728.html

时间: 2024-11-08 22:44:30

Kruskal算法(最小生成树)的相关文章

POJ-2349(kruskal算法+最小生成树中最大边的长度)

Arctic POJ-2349 这题是最小生成树的变形题目.题目的意思是已经有s个卫星频道,这几个卫星频道可以构成一部分的网络,而且不用费用,剩下的需要靠d的卫星接收器.题目要求的就是最小生成树中,最大的边的长度. 题目中的传入kruskal函数里面的sn表示还需要连接的顶点个数,因为剩下的可以使用卫星频道来连接. 剩下的就是kruskal的问题了,这里通过当前最大边来返回答案. #include<iostream> #include<cstdio> #include<alg

hdu 1875 畅通工程再续(kruskal算法计算最小生成树)

畅通工程再续 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 18411    Accepted Submission(s): 5769 Problem Description 相信大家都听说一个"百岛湖"的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖,发展首先

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算法

上一篇文章中提到了最小生成树的Prim算法,这一节继续探讨一下最小生成树的Kruskal算法.什么是最小生成树算法上文已经交代过了,所以我们直接从Kruskal的步骤开始介绍. 1.Kruskal算法的步骤: a.假定拓扑图的边的集合是E,初始化最小生成树边集合G={}. b. 遍历集合E中的所有元素,并且按照权值的大小进行排序. c. 找出E中权值最小的边e . d .如果边e不和最小生成树集合G中的边构成环路,则将边e加到边集合G中:否则测试下一条权值次小的边,直到满足条件为止. e. 重复

Prim算法和Kruskal算法求最小生成树

Prim算法 连通分量是指图的一个子图,子图中任意两个顶点之间都是可达的.最小生成树是连通图的一个连通分量,且所有边的权值和最小. 最小生成树中,一个顶点最多与两个顶点邻接:若连通图有n个顶点,则最小生成树中一定有n-1条边. Prim算法需要两个线性表来进行辅助: visited: 标记已经加入生成树的顶点:(它的功能可以由tree取代) 初始状态:生成树根节点为真,其它为0. tree: 记录生成树,tree[x]保存顶点x的直接根节点下标,若x为树的根节点则tree[x]为其自身. 初始状

kruskal算法求最小生成树(jungle roads的kruskal解法)

注意: 注意数组越界问题(提交出现runtimeError代表数组越界) 刚开始提交的时候,边集中边的数目和点集中点的数目用的同一个宏定义,但是宏定义是按照点的最大数定义的,所以提交的时候出现了数组越界问题,以后需要注意啦. Description The Head Elder of the tropical island of Lagrishan has a problem. A burst of foreign aid money was spent on extra roads betwe

最小生成树——Kruskal算法

前面介绍了最小生成树和Prim算法,这篇博客继续记录Kruskal算法的相关内容. 算法思想: 1. 先将所有边按权值由小到大排序: 2. 从边集中选出第一条边(即权值最小的边),如果与树中现有的边不构成环,则将其加入树中: 3. 重复步骤2直至树中有n-1条边. 在实现上述算法之前,要先解决三个问题: 1. 如何表示一条边? 虽然我们尽量简化情景方便实现,但是边还是不能像节点一样简单地用一个数表示,因为它有三个必备的属性:起点.终点和权值.因此,我们创建以下结构体来表示边: 1 // 定义表示

最小生成树(prim算法,Kruskal算法)c++实现

1.生成树的概念 连通图G的一个子图如果是一棵包含G的所有顶点的树,则该子图称为G的生成树. 生成树是连通图的极小连通子图.所谓极小是指:若在树中任意增加一条边,则将出现一个回路:若去掉一条边,将会使之变成非连通图. 生成树各边的权值总和称为生成树的权.权最小的生成树称为最小生成树. 2.最小生成树的性质用哲学的观点来说,每个事物都有自己特有的性质,那么图的最小生成树也是不例外的.按照生成树的定义,n 个顶点的连通网络的生成树有 n 个顶点.n-1 条边. 3.构造最小生成树,要解决以下两个问题

最小生成树之 prim算法和kruskal算法(以 hdu 1863为例)

最小生成树的性质 MST性质:设G = (V,E)是连通带权图,U是V的真子集.如果(u,v)∈E,且u∈U,v∈V-U,且在所有这样的边中, (u,v)的权c[u][v]最小,那么一定存在G的一棵最小生成树,(u,v)为其中一条边. 构造最小生成树,要解决以下两个问题: (1).尽可能选取权值小的边,但不能构成回路(也就是环). (2).选取n-1条恰当的边以连接网的n个顶点. Prim算法的思想: 设G = (V,E)是连通带权图,V = {1,2,-,n}.先任选一点(一般选第一个点),首

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