树的应用

最小生成树

生成树连通图包含全部顶点的一个极小连通子图
在这里插入图片描述
对于带权无向连通图G= (V,E),G的所有生成树当中边的权值之和最小的生成树为G的最小生成树(MST).

在这里插入图片描述
在这里插入图片描述

性质

 1)最小生成树不一定唯一,即最小生成树的树形不一定唯一。当带权无向连通图G的各边权值不等时或G只有结点数减1条边时,MST唯一。
 2)最小生成树的权值是唯一的,且是最小。
 3)最小生成树的边数为顶点数减1
IGENRIC_MST《G)[
	T=NULL;
	while T未形成一棵生戍树:
		do 找到一条最小代价边(u,v)并且加入T后不会产生回路:
		T=Tu(u, v);

在这里插入图片描述

void prim(G,T){
	T=空集;
	U= {w};
	while ( (v-u)!=空集》{
	设(u, v)是使ueU与ve(v-U),且权值最小的边;
	T=Tu{ (u, v)};
	U = Uu{v};
	}
}
void MsT_Prim(Graph Gi
int min_weight[G.vexnum];
int adjvex[G.vexnum];
for(int i=0 ; i<G.vexnum; i++)(
min_weight[i]= G.Edge [o][i];
adjvex[i] =0;
int min_arc;
int min_vex;
for(inti=l; i<G.vexnum; i++){
	min_arc = MAX;
	for(int j=1; j<G.vexnum;j++)
	if (min_weight[j]!=0&& min_weight[j]<min_arc)t
		min_arc = min_weight[j;
		min_vex = j:
	min_ weight[min_vex]= 0;
	for(int j=0; j<G.vexnum; j++){
	if(min_weight[j]!=0&tG.Edge [min_arc][j]<min_weight[j1)(
		min_weighttj] = G.Edge [min_arc][j];
		adjvex[j]= min_arc;

在这里插入图片描述

void Kruskal (V,T){
T=V;
numS=n;
while (nums>1){
从E中取出权值最小的边(v, u);
if(v和u属于T中不同的连通分量){
T= Tu{ (v, u)};
numS--;

typedef struct Edge{
int a, b;
int weight;
);
void MsT_Kruskal(Graph G,Edge* edges, int* parent) [
heap_sort(edges) ;
Initial(parent);
for(int i=0; i<G.arcnum; i++){
int a_root=Find (parent, edges[i].a);
int b_root=Find (parent, edges[i].b);
if(a_root!=b_root)
Union (parent, a_root, b_root);

链接: 哈夫曼树、编码应用.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sf9090

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值