数据结构-最小生成树

生成树

生成树是连通图的最小连通子图。所谓最小是指:若在树中任意增加一条边,则将出现一个回路;若去掉一条边,将会使之变成非连通图。按照该定义,n个顶点的连通网络的生成树有n个顶点,n-1条边。

最小生成树

设G=(V,E)是一个无向连通图,生成树上各边的权值之和称为该生成树的代价,在G的所有生成树中,代价最小的生成树称为最小生成树(minimal spanning tree)

普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法是两个利用MST性质构造最小生成树的经典算法。

MST性质

最小生成树具有MST性质:假设G=(V,E)是一个无向连通图,U是顶点集V的一个非空子集。若(u,v)是一条具有最小权值的边,其中u∈U,v∈V-U,则必存在一颗包含边(u,v)的最小生成树。

Prim算法

Prim算法的基本思想是:设G = (V,E)是一个无项联通网,令T = (U,TE)是G的最小生成树。T的初始状态为U={v0},(v0∈V),TE={ },然后重复执行下述操作:在所有的u∈U,v∈V-U的边中找一条代价最小的边(u,v)并入集合TE,同时v并入U,直至U=V为止。此时TE中必有n-1条边,则T就是一颗最小生成树。Prim算法的基本思想伪代码如下:

1.初始化:U={ v0};TE={ } ;
2.重复下述操作直到U=V:
     2.1 在E中寻找最短边(u,v),且满足u∈U,v∈V-U
     2.2 U = U +{ v }
     2.3 TE = TE +{ (u,v) }

设置一个数组shortEdge[n]表示候选最短边集,数组元素包括adjvex和lowcast两个域,分别表示候选最短边的邻接点和权值.

Prim算法用伪代码描述为:

1.初始化辅助数组shortEdge[n];
2.输出顶点v0,将顶点0加入集合U中;
3.重复执行下列操作n-1次;
     3.1 在shortEdge[n].lowcast中选取最短边及对应的临界点编号k;
     3.2 输出顶点k和对应的权值;
     3.3 将顶点k加入集合U中;
     3.4 调整数组shortEdge[n];

Prim实现函数代码如下:

#include<bits/stdc++.h>
using namespace std;
#define inf 0x7fffffff//无穷大
#define maxn 5005
int cost[maxn][maxn],minn;
int n,m,v2[maxn],tot=1,now,ans;
bool v1[maxn];//v1为标记数组,v2为顶点到当前顶级的权值。
void getcost()
{
      scanf("%d%d",&n,&m);//读入点和边
      for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                  cost[i][j]=inf;//初始化,将全部边设为无穷大
      for(int i=1;i<=m;i++){
            int u,v,w;
            scanf("%d%d%d",&u,&v,&w);//读入起始点,目标点和位权
            if(cost[u][v]>w)//表示两个顶点是联通的.
                  cost[u][v]=cost[v][u]=w;//无向图只有一条路,双向
      }//初始化cost数组,v2表示起始点到个点的距离
      for(int i=1;i<=n;i++)
        v2[i]=cost[1][i];
    v1[1]=1;//找出与1节点相连的边并进行标记
}
int prim()
{
      while(tot<n)//最小生成树的概念,只用n-1条边就行
      {
            minn=inf;
            tot++;  //循环一个加一
            for(int i=1;i<=n;i++){
                  if(!v1[i]&&v2[i]<minn){
                        minn=v2[i];//最小值
                        now=i;//顶点编号
                  }
            }//找出与顶点联通且是最小边
            ans+=minn;//更新答案
            for(int i=1;i<=n;i++)
                  if(!v1[i]&&v2[i]>cost[now][i])//在没有标记的点中,找出一条
                        //自己到自己的距离为无穷大
                        v2[i]=cost[now][i];//更新与已知边的最短距离,不一定要1号顶点,
                        //此时v2不再表示1号顶点到个顶点的距离
            v1[now]=1;//在找出与now节点相连的边并进行标记
      }
      return ans;
}
int main()
{
      getcost();
      printf("%d",prim());
      return 0;
}

代码说明:
第一行包含两个整数N、M,表示该图共有N个结点和M条无向边。(N<=5000,M<=200000)
接下来M行每行包含三个整数Xi、Yi、Zi,表示有一条长度为Zi的无向边连接结点Xi、Yi.
输出包含一个数,即最小生成树的各边的长度之和;

输入数据
4 5
1 2 2
1 3 2
1 4 3
2 3 4
3 4 3

输出结果7

PS:题目来自于洛谷


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容

  • 最小生成树 如下图是个带权值的网结构图。要用最小的成本将所有元素连接起来,即n个顶点,用n-1条边把连通图连接起来...
    yinxmm阅读 2,067评论 0 0
  • 假设要在n个城市之间建立通信联络网,则联通n个城市需要n-1条线路。这时需要考虑如何建设才能最省钱呢?用连通网来表...
    Qi0907阅读 1,612评论 0 1
  • 最小生成树 列子引入 分析 这幅图只一个带权值的图,即网结构。 所谓最小成本,就是n个顶点,用n-1条边把一个连通...
    NotFunGuy阅读 17,535评论 3 15
  • 1. 图的定义和基本术语 线性结构中,元素仅有线性关系,每个元素只有一个直接前驱和直接后继;树形结构中,数据元素(...
    yinxmm阅读 5,435评论 0 3
  • 对谁都能毫无顾忌的笑, 一见你,就只会傻笑! 恋上你的一颦一笑, 你却说,这花花世界还是不必当真的好! 我失了我原...
    清泽阅读 194评论 10 3