模板整理——图论·最小生成树·Kruskal

原创 2017年10月26日 22:40:09

思想:把所有边按权值从小到大排序,每次取最小的未处理边e,若e连接的两个点u,v不在同一集合,则将e加入最小生成树,将u,v放入同一集合(并查集),一共需要加入n-1条边

时间复杂度:O(mlgm)

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int fa[105];
struct node
{
    int u,v,l;
}e[105];
bool cmp(node t1,node t2)
{
    return t1.l<t2.l;
}
int Find(int u)
{
    if (u==fa[u]) return u;
    fa[u]=Find(fa[u]);
    return fa[u];
}
void Union(int u,int v)
{
    int x=Find(u),y=Find(v);
    fa[y]=x;
}
int main()
{
    int n,m;
    scanf("%d%d",&m,&n);
    while (m!=0)
    {
        int num=0;
        for (int i=1; i<=n; i++) fa[i]=i;
        memset(e,0,sizeof(e));
        for (int i=1; i<=m; i++) 
        {
            int u,v,l;
            scanf("%d%d%d",&u,&v,&l);
            e[++num].u=u;
            e[num].v=v;
            e[num].l=l;
        }
        sort(e+1,e+1+num,cmp);
        int s=0,ans=0;
        for (int i=1; i<=num; i++)
        {
            int u=e[i].u,v=e[i].v;
            if (Find(u)!=Find(v)) 
            {
                s++;
                Union(u,v);
                ans+=e[i].l;
                if (s==n-1) break; 
            }
        }
        if (s<n-1) printf("?\n");
        else printf("%d\n",ans);
        scanf("%d%d",&m,&n);
    }
    return 0;
}

代码是这题的–>__–>HDU1863畅通工程

版权声明:本文为博主原创文章,未经博主允许不得转载。

最小生成树-Kruskal算法(模板)

Kruskal基本算法:每次选取最短的边,看该边相连的两点是否在同一集合内,若在,则跳过,若不在,就把两个点合并,判断与合并都用并查集实现。 Kruskal的复杂度是O(ElogE),适合稀疏图。...
  • algzjh
  • algzjh
  • 2016年08月25日 10:49
  • 1057

最小生成树之Kruskal算法

给定一个无向图,如果它任意两个顶点都联通并且是一棵树,那么我们就称之为生成树(Spanning Tree)。如果是带权值的无向图,那么权值之和最小的生成树,我们就称之为最小生成树(MST, Minim...
  • luomingjun12315
  • luomingjun12315
  • 2015年08月18日 08:12
  • 26019

图论之最小生成树

图论之最小生成树
  • fengyingjie2
  • fengyingjie2
  • 2016年08月12日 20:30
  • 327

最小生成树-kruskal算法

Kruskal算法按照边的权重大小处理,每一次从待选边中选出最小的边,企图加入到生成树当中。但此时存在一个问题,若当前边加入生成树后存在环路,则该边废弃。一直重复这一过程,直到所有的点都已经加入生成树...
  • turingwy
  • turingwy
  • 2016年02月19日 15:36
  • 1471

最小生成树Kruskal算法朴素版 C语言实现

最小生成树Kruskal算法朴素版 C语言实现
  • sunshineacm
  • sunshineacm
  • 2017年12月11日 22:15
  • 75

最小生成树模板(prim+kruskal+prim的优化)

最小生成树:解决极小连通子图连接所有点使得花费最小问题 1.prim算法 思想:随机选择一个点,作为初始集合,并保存所有点到这个集合的最短距离,然后找与这个集合距离最短的点,也将其加入这个集合,由于新...
  • xinshoushanglu2333
  • xinshoushanglu2333
  • 2015年11月24日 01:29
  • 247

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

Kruskal算法 求解最小生成树的另一种常见算法是Kruskal算法,它比Prim算法更直观。从直观上看,Kruskal算法的做法是:每次都从剩余边中选取权值最小的,当然,这条边不能使已有...
  • zhangxiangDavaid
  • zhangxiangDavaid
  • 2014年08月07日 11:45
  • 5012

Kruskal算法(贪心+并查集=最小生成树)

http://www.51nod.com/ Kruskal算法的高效实现需要一种称作并查集的结构。我们在这里不介绍并查集,只介绍Kruskal算法的基本思想和证明,实现留在以后讨论。 Krusk...
  • liangzhaoyang1
  • liangzhaoyang1
  • 2016年04月16日 17:34
  • 7192

贪婪算法-最小生成树-Kruskal算法

最小生成树是找出图中包括所有结点的联通子图,使得其所有的边的权重之和最小。 Kruskal 算法提供一种在 O(ElogV) 运行时间确定最小生成树的方案。其选择的贪心策略就是,每次都选择权重最小...
  • u010726042
  • u010726042
  • 2016年04月10日 21:47
  • 667

生成树和最小费用生成树以及Kruskal算法

Spanning Tree --生成树    生成树是一种特殊通路,在实际应用中具有广泛意义。 比如:将道路网表示一个图,则生成树就表示从某地出发,到达所有其他各地且不绕圈子的直达路径,就是不经过同一...
  • leaf_130
  • leaf_130
  • 2016年02月15日 15:15
  • 623
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:模板整理——图论·最小生成树·Kruskal
举报原因:
原因补充:

(最多只允许输入30个字)