计算最小生成树

一,什么是最小生成树

1,什么是生成树

如果连通图G的一个子图是一棵包含G所有顶点的树,则该子图成为G的生成树。

生成树是含有该连通图全部顶点的一个极小连通子图,它并不是唯一的,从不同的顶点出发可以得到不同的子树。含有N个顶点的连通图的生成树有N-1条边。

2,如何求一个连通图的生成树

要求一个连通图的生成树只需要从一个顶点出发,做一次深度优先或广度优先的搜索,将所经过的N个顶点和N-1条边连接起来,就形成了一个极小连通子图,也就是一棵生成树。

3,最小生成树

对一个带权的图,在一棵生成树中,各条边的权值之和为这棵生成树的代价,其中代价最小的生成树成为最小生成树。

二,计算最小生成树的两种算法

1,Prim算法

假设G=(V,E)是一个带权图,生成的最小生成树为MinT=(V,T),其中V为顶点的集合,T为边的集合。

算法描述:

1,初始化:U={u0},T={}.

其中U为一个新设置的顶点的集合,初始U中只含有顶点u0,这里假设在构造最小生成树时,从顶点u0出发;

2,对所有的u∈U,
v∈(V-U)的边中,找一条权最小的边(u‘,v‘),将这条边加入到集合T中,将顶点v‘加入到集合U中;

3,如果U=V,则算法结束;否则重复2,3步;

最后,找到V3和包围圈内的最小的边:

2,Kruskal算法

算法描述:

1,设G=(V,E),令最小生成树初始状态为只有n个顶点而无边的,非连通图T=(V,{}),每个顶点自成一个连通分量;

2,在E中选取代价最小的边,若该边依附的顶点落在T中不同的连通分量上,则将此边加入到T中,否则,舍去此边,选取下一条代价最小的边。

3,依此类推,重复2,直至T中所有顶点都在同一连通分量上。

时间: 2024-10-26 16:37:36

计算最小生成树的相关文章

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 相信大家都听说一个"百岛湖"的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖,发展首先

计算最小生成树代价和

题目网址: http://codeup.cn/problem.php?cid=100000985&pid=0 1 /** 2 普里姆算法构造最小生成树 3 */ 4 #include <stdio.h> 5 #define N 105 6 #define INF 60000 7 int G[N][N],n; 8 typedef struct { 9 int dist; 10 int data; 11 }Closedge; 12 int ans; 13 void prim(int s){

kuangbin专题六、最小生成树

题意:给你一个无向图,每个点都是大写字母,让你计算最小生成树的权值 ps:%c最好别用,%s才是最好的选择,大写字母转化成对应的序列位置可以 -'A'+1 然后fa[maxn]要初始化,edges[maxn*maxn]的大小要maxn*maxn,还要按边权排个序... 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namesp

【HDU 4408】Minimum Spanning Tree(最小生成树计数)

Problem Description XXX is very interested in algorithm. After learning the Prim algorithm and Kruskal algorithm of minimum spanning tree, XXX finds that there might be multiple solutions. Given an undirected weighted graph with n (1<=n<=100) vertex

蓝桥杯 algo——6 安慰奶牛 (最小生成树)

问题描述 Farmer John变得非常懒,他不想再继续维护供奶牛之间供通行的道路.道路被用来连接N个牧场,牧场被连续地编号为1到N.每一个牧场都是一个奶牛的家.FJ计 划除去P条道路中尽可能多的道路,但是还要保持牧场之间 的连通性.你首先要决定那些道路是需要保留的N-1条道路.第j条双向道路连接了牧场Sj和Ej(1 <= Sj <= N; 1 <= Ej <= N; Sj != Ej),而且走完它需要Lj的时间.没有两个牧场是被一条以上的道路所连接.奶牛们非常伤心,因为她们的交通

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

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

十大基础实用算法之迪杰斯特拉算法、最小生成树和搜索算法

迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本思想 通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算). 此外,引进两个集合S和U.S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求出最短路径的顶点(以及该顶点到起点s的距离). 初始时,S中只有起点s:U中是除s之外的顶点,并且U中顶点的路径是"起点s

二维平面曼哈顿距离最小生成树模版

#include <stdio.h> #include <iostream> #include <algorithm> #include <sstream> #include <stdlib.h> #include <string.h> #include <limits.h> #include <vector> #include <string> #include <time.h> #i

UVALive 3662 Another Minimum Spanning Tree 曼哈顿最小生成树

题目链接:点击打开链接 题意: 给定二维平面的n个点坐标,问曼哈顿MST 的值. 模版题 #include <stdio.h> #include <iostream> #include <algorithm> #include <sstream> #include <stdlib.h> #include <string.h> #include <limits.h> #include <vector> #incl