模板整理——图论·最小生成树·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畅通工程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/adorkable_/article/details/78359597

图的最小生成树(一)—Kruskal算法

求下图的最小生成树: 数据给出如下: 第一行有两个数,n表示n个城市,m表示m条道路,接下来的m行,每行三个数a,b,c表示城市a到城市b的路程c。 现在需要...
  • wtyvhreal
  • wtyvhreal
  • 2015-02-05 13:20:34
  • 2659

图论基础最小生成树之kruskal算法并查集版(加边法)

#include #include typedef struct {    int x,y;    int w;     }edger; edger edge[900]; int father[90...
  • lszdh
  • lszdh
  • 2011-08-12 15:32:18
  • 636

最小生成树总结(prim、并查集和kruskal) C++实现

摘要: 本文按照如下顺序进行: 1.介绍最小生成树的概念; 2.介绍prim算法的思想,以及C++实现; 3.介绍并查集概念,给出C++并查集的代码实现(因为kruskal算法必须用到并查集,所以在这...
  • bobkentblog
  • bobkentblog
  • 2015-09-27 03:44:04
  • 1625

图论中最小生成树构造算法之Prim算法和Kruskal算法

图是 由顶点的有穷非空集合和点之间边的集合构成: G={V,E},V是顶点集合,E是顶点之间边的集合。根基顶点之间边有无方向性可分为:有向图和无向图: 在图中,当对边赋予有意义数值时候,成为网图。...
  • yanerhao
  • yanerhao
  • 2015-06-25 16:24:42
  • 2762

Kruskal求最小生成树

  • 2009年02月08日 11:48
  • 2KB
  • 下载

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

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

图的最小生成树:Prim算法和Kruskal算法

1. 图的最小生成树 生成树的定义:如果连通图G的一个子图是一棵包含G的所有顶点的树,则该子图称为G的生成树。 生成树是连通图的包含图中的所有顶点的极小连通子图。它并不唯一,从不同的顶点出发进行遍...
  • jinzhao1993
  • jinzhao1993
  • 2016-04-29 00:33:01
  • 2087

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

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

poj1287 Networking 最小生成树模板题。prim+kruskal算法AC

You are assigned to design network connections between certain points in a wide area. You are given ...
  • Lionel_D
  • Lionel_D
  • 2015-03-26 15:09:43
  • 964

最小生成树-kruskal算法

Kruskal算法按照边的权重大小处理,每一次从待选边中选出最小的边,企图加入到生成树当中。但此时存在一个问题,若当前边加入生成树后存在环路,则该边废弃。一直重复这一过程,直到所有的点都已经加入生成树...
  • turingwy
  • turingwy
  • 2016-02-19 15:36:00
  • 1631
收藏助手
不良信息举报
您举报文章:模板整理——图论·最小生成树·Kruskal
举报原因:
原因补充:

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