kruskl算法c语言邻接矩阵,详解图的应用(最小生成树、拓扑排序、关键路径、最短路径).pdf...

详详解解图图的的应应用用 ((最最小小生生成成树树、、拓拓扑扑排排序序、、关关键键路路径径、、最最短短路路径径))

1.最最小小生生成成树树::无无向向连连通通图图的的所所有有生生成成树树中中有有 棵棵边边的的权权值值总总和和最最小小的的生生成成树树

1.1 问问题题背背景景::

假设要在n个城市之间建立通信联络网,则连通n个城市只需要n― 1条线路。这时,自然会考虑这样 个问题,如何在最节省经

费的前提下建立这个通信网。在每两个城市之间都可以设置 条线路,相应地都要付出 定的经济代价。n个城市之间,最多可

能设置n(n-1)/2条线路,那么,如何在这些可能的线路中选择n-1条,以使总的耗费最少呢?

1.2 分分析析问问题题 ((建建立立模模型型))::

可以用连通网来表示n个城市以及n个城市间可能设置的通信线路,其中网的顶点表示城市,边表示两城市之间的线路,赋于边

的权值表示相应的代价。对于n个顶点的连通网可以建立许多不同的生成树,每 棵生成树都可以是 个通信网。即无向连通图

的生成树不是唯 的。连通图的 次遍历所经过的边的集合及图中所有顶点的集合就构成了该图的 棵生成树,对连通图的不同

遍历,就可能得到不同的生成树。

图 G5无向连通图的生成树 为(a)、(b)和(c)图所示:

G5

G5的的三三棵棵生生成成树树:

可以证明,对于有n 个顶点的无向连通图,无论其生成树的形态如何,所有生成树中都有且仅有n-1 条边。

1.3最最小小生生成成树树的的定定义义::

如果无向连通图是 个网,那么,它的所有生成树中必有 棵边的权值总和最小的生成树,我们称这棵生成树为最小生成树,简

称为最小生成树。

最小生成树的性质:

假设N=(V,{ E}) 是个连通网,U是顶点集合V 的 个非空子集,若 (u,v )是个 条具有最小权值(代价)的边,其中,

则必存在 棵包含边 (u,v )的最小生成树。

1.4 解解决决方方案案::

两种常用的构造最小生成树的算法:普里姆 (Prim )和克鲁斯卡尔 (Krus al)。他们都利用了最小生成树的性质

1.普普里里姆姆 ((Prim))算算法法::有有线线到到点点,,适适合合边边稠稠密密。。时时间间复复杂杂度度O(N^2)

假设G = (V ,E)为连通图,其中V 为网图中所有顶点的集合,E 为网图中所有带权边的集合。设置两个新的集合U 和T ,其中

集合U (顶点集) 用于存放G 的最小生成树中的顶点,

集合T (边集合)存放G 的最小生成树中的边。

T ,U的初始状态:令集合U 的初值为U ={u1} (假设构造最小生成树时,从顶点u1 出发),集合T 的初值为T ={} 。

Prim 算法的思想是:从所有u ∈U,v ∈V -U 的边中,选取具有最小权值的边 (u,v )∈E,将顶点v 加入集合U 中,将边 (u,

v )加入集合T 中,如此不断重复,直到U =V 时,最小生成树构造完毕,这时集合T 中包含了最小生成树的所有边。

Prim 算法可用下述过程描述,其中用wuv 表示顶点u 与顶点v 边上的权值。

(1)U ={u1},T ={};

(2 )while (U≠V)do

(u,v)=min{wuv ;u ∈U,v ∈V -U }

T =T +{(u,v)}

U =U +{v}

(3 )结束。

按照Prim 方法,从顶点1 出发,该网的最小生成树的产生过程如图:

为实现Prim 算法,需设置两个辅助closedge,用来保存U到集合V -U 的各个顶点中具有最小权值的边的权值。对每个V i ∈ (V-

U )在辅助数组中存在 个相应的分量closedge[i-1],它包括两个域:

typedef struct A rcNode

{

int adjvex; //adj ex域存储该边依附的在U 中的顶点

V rType lowcost; //lowcost域存储该边上的权重

}closedge[MA X_V ERT EX_ NUM];

显然:

初始状态时,U ={v 1}(u1 为出发的顶点),则到V-U 中各项中最小的边,即依附顶点v 1的各条边中,找到 条代价最小的边 (u0

,v0 )= (1,3 )为生成树上 条边。

同时将v0 (=v3 )并入集合U 中。然后修改辅助数组的值。

1)将closedge[2].lowcost = 0 ;//表示顶点V3三已经并入U

2) 由于边 (v2,v3 )的权值小于closedge[1].lowcos

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值