导航:首页 > 源码编译 > 最短路径树算法

最短路径树算法

发布时间:2022-04-21 17:36:51

❶ 求解:图论中常见的最短路径算法有几种都是什么

主要是有三种、、

第一种是最直接的贪心dijkstra算法、、可以利用堆数据结构进行优化、、缺点就是不能求有负权的最短路与判断负环、、

第二种是bellman-ford算法、、根据松弛操作的性质是可以来判断负环的、、时间复杂度是O(nm)的、、

第三种是SPFA算法、、把他单独拿出来作为一种算法并不是非常好的、、他的实质应该是上面的bellman-ford算法的队列优化时间复杂度更低、O(KE)、K的值约等于2、、

❷ "最短路径优先算法"的优缺点

所谓的最短路径问题有很多种意思,
在这里启发式指的是一个在一个搜寻树的节点上定义的函数h(n),用于评估从此节点到目标节点最便宜的路径。启发式通常用于资讯充分的搜寻算法,例如最好优先贪婪算法与a*。最好优先贪婪算法会为启发式函数选择最低代价的节点;a*则会为g(n)
+
h(n)选择最低代价的节点,此g(n)是从起始节点到目前节点的路径的确实代价。如果h(n)是可接受的(admissible)意即h(n)未曾付出超过达到目标的代价,则a*一定会找出最佳解。
最能感受到启发式算法好处的经典问题是n-puzzle。此问题在计算错误的拼图图形,与计算任两块拼图的曼哈顿距离的总和以及它距离目的有多远时,使用了本算法。注意,上述两条件都必须在可接受的范围内。

❸ 实现最小生成树和最短路径的算法(matlab)

graphminspantree, 最小生成树
graphshortestpath, 一条最短路径
graphallshortestpaths, 所有最短路径

❹ OSPF协议中,最短路径树是如何计算的哪个设备是最短路径树的根

最短路径是Dijkstra算法,可以看《数据结构》中相关算法篇幅,或者参考网络中的“Dijkstra算法”http://ke..com/view/7839.htm
每一台路由器都已自己为根节点来使用SPF算来计算路由。

❺ 权图中求最短路径都有哪些算法

带权图也分有向和无向两种,基本的算法可以看看书咯。
带权的无向图的最短路径又叫最小生成树,Prim算法和Kruskal算法;
带权的有向图的最短路径算法有迪杰斯特拉算法和佛洛依德算法;

❻ 有没有做算法的人最短路径树SPT有哪些算法

IP 组播技术实现了 IP 网络中点到多点的高效数据传送。因为组播能够有效地节约网络带宽、降低网络负载,所以在实时数据传送、多媒体会议、数据拷贝、游戏和仿真等诸多方面都有广泛的应用。本文介绍了组播的基本概念和目前通用的组播协议,以及组播组网的基本方案;并针对组播业务需求和运营过程中面临的问题,提出了电信级的可运营、可管理的“受控组播”解决方案,包括信源管理、用户管理和组播安全控制等方面的内容。

关键词
组播 运营管理 受控组播 IGMP DVMRP PIM-SM PIM-DM MBGP MSDP

1 组播概述
1.1组播技术的产生原因
传统的IP通信有两种方式:第一种是在一台源 IP 主机和一台目的 IP 主机之间进行,即单播(unicast);第二种是在一台源 IP 主机和网络中所有其它的 IP 主机之间进行,即广播(broadcast)。如果要将信息发送给网络中的多个主机而非所有主机,则要么采用广播方式,要么由源主机分别向网络中的多台目标主机以单播方式发送 IP 包。采用广播方式实现时,不仅会将信息发送给不需要的主机而浪费带宽,也可能由于路由回环引起严重的广播风暴;采用单播方式实现时,由于 IP 包的重复发送会白白浪费掉大量带宽,也增加了服务器的负载。所以,传统的单播和广播通信方式不能有效地解决单点发送多点接收的问题。

IP 组播是指在 IP 网络中将数据包以尽力传送(best-effort)的形式发送到网络中的某个确定节点子集,这个子集称为组播组(multicast group)。IP 组播的基本思想是,源主机只发送一份数据,这份数据中的目的地址为组播组地址;组播组中的所有接收者都可接收到同样的数据拷贝,并且只有组播组内的主机(目标主机)可以接收该数据,网络中其它主机不能收到。组播组用 D 类 IP 地址(224.0.0.0 ~ 239.255.255.255)来标识。

1.2组播技术的市场前景
IP 组播技术有效地解决了单点发送多点接收的问题,实现了 IP 网络中点到多点的高效数据传送,能够大量节约网络带宽、降低网络负载。作为一种与单播和广播并列的通信方式,组播的意义不仅在于此。更重要的是,可以利用网络的组播特性方便地提供一些新的增值业务,包括在线直播、网络电视、远程教育、远程医疗、网络电台、实时视频会议等互联网的信息服务领域。

组播从 1988 年提出到现在已经经历了十几年的发展,许多国际组织对组播的技术研究和业务开展进行了大量的工作。随着互联网建设的迅猛发展和新业务的不断推出,组播也必将走向成熟。尽管目前端到端的全球组播业务还未大规模开展起来,但是具备组播能力的网络数目在增加。一些主要的 ISP 已运行域间组播路由协议进行组播路由的交换,形成组播对等体。在 IP 网络中多媒体业务日渐增多的情况下,组播有着巨大的市场潜力,组播业务也将逐渐得到推广和普及。

2 组播技术的基本原理
组播技术涵盖的内容相当丰富,从地址分配、组成员管理,到组播报文转发、路由建立、可靠性等诸多方面。下面首先介绍组播协议体系的整体结构,之后从组播地址、组播成员管理、组播报文转发、域内组播路由和域间组播路由等几个方面介绍有代表性的协议和机制。

2.1组播协议体系结构
根据协议的作用范围,组播协议分为主机-路由器之间的协议,即组播成员管理协议,以及路由器-路由器之间协议,主要是各种路由协议。组成员关系协议包括 IGMP(互连网组管理协议);组播路由协议又分为域内组播路由协议及域间组播路由协议两类。域内组播路由协议包括 PIM-SM、PIM-DM、DVMRP 等协议,域间组播路由协议包括 MBGP、MSDP 等协议。同时为了有效抑制组播数据在二层网络中的扩散,引入了 IGMP Snooping 等二层组播协议。

通过 IGMP 和二层组播协议,在路由器和交换机中建立起直联网段内的组成员关系信息,具体地说,就是哪个接口下有哪个组播组的成员。域内组播路由协议根据 IGMP 维护的这些组播组成员关系信息,运用一定的组播路由算法构造组播分发树,在路由器中建立组播路由状态,路由器根据这些状态进行组播数据包转发。域间组播路由协议根据网络中配置的域间组播路由策略,在各自治系统(AS,Autonomous System)间发布具有组播能力的路由信息以及组播源信息,使组播数据能在域间进行转发。

2.2组播地址机制
2.2.1组播IP地址
IP组播地址用于标识一个 IP 组播组。IANA 把 D 类地址空间分配给组播使用,范围从 224.0.0.0 到 239.255.255.255。如下图所示(二进制表示),IP 组播地址前四位均为“1110”。

2.2.2组播地址的划分
整个 IP 组播地址的空间划分如下图所示。

其中:

224.0.0.0 到 224.0.0.255 地址范围被 IANA 预留,地址 224.0.0.0 保留不做分配,其它地址供路由协议及拓扑查找和维护协议使用。该范围内的地址属于局部范畴,不论生存时间字段(TTL)值是多少,都不会被路由器转发;

224.0.1.0 到 238.255.255.255 地址范围作为用户组播地址,在全网范围内有效。其中233/8 为 GLOP 地址。GLOP 是一种自治系统之间的组播地址分配机制,将 AS 号直接填入组播地址的中间两个字节中,每个自治系统都可以得到 255 个组播地址;

239.0.0.0 到 239.255.255.255 地址范围为本地管理组播地址(***istratively scoped addresses),仅在特定的本地范围内有效。

当 IP 层收到组播数据报文时,根据组播目的地址查找组播转发表,对报文进行转发。

2.2.3IP 组播地址到 MAC 地址的映射
IANA 将 MAC 地址范围 01:00:5E:00:00:00 ~ 01:00:5E:7F:FF:FF 分配给组播使用,这就要求将28位的 IP 组播地址空间映射到 23 位的 MAC 地址空间中,具体的映射方法是将组播地址中的低 23 位放入 MAC 地址的低 23 位,如下图所示。

由于 IP 组播地址的后 28 位中只有 23 位被映射到 MAC 地址,这样会有 32 个 IP 组播地址映射到同一 MAC 地址上。

2.3组播成员管理
2.3.1IGMP ( Internet Group Management Protocol )
IGMP 协议运行于主机和与主机直接相连的组播路由器之间,IGMP 实现的功能是双向的:一方面,通过 IGMP 协议,主机通知本地路由器希望加入并接收某个特定组播组的信息;另一方面,路由器通过 IGMP 协议周期性地查询局域网内某个已知组的成员是否处于活动状态(即该网段是否仍有属于某个组播组的成员),实现所连网络组成员关系的收集与维护。通过 IGMP,在路由器中记录的信息是某个组播组是否在本地有组成员,而不是组播组与主机之间的对应关系。

到目前为止,IGMP 有三个版本。IGMPv1(RFC1112)中定义了基本的组成员查询和报告过程;目前通用的是 IGMPv2,由 RFC2236 定义,在 IGMPv1 的基础上添加了组成员快速离开的机制;IGMPv3 中增加的主要功能是成员可以指定接收或指定不接收某些组播源的报文。以下着重介绍 IGMPv2 协议的原理。

IGMPv2 的原理如下图所示:

当同一个网段内有多个组播路由器时,IGMPv2 通过查询器选举机制从中选举出唯一的查询器。查询器周期性地发送通用组查询消息进行成员关系查询;主机发送报告消息来响应查询。主机发送报告消息的时间有随机性,当检测到同一网段内有其它成员发送同样的消息时,则抑制自己的响应报文。如果有新的主机要加入组播组,不必等待查询器的查询消息,而是主动发送报告消息。当要离开组播组时,主机发送离开组消息;收到离开组消息后,查询器发送特定组查询消息来确定是否所有组成员都已离开。对于作为组成员的路由器而言,其行为和普通的主机一样,响应其它路由器的查询。

通过上述机制,在组播路由器里建立起一张表,其中记录了路由器的各个接口所对应的子网上都有哪些组的成员。当路由器接收到某个组 G 的数据报文后,只向那些有 G 的成员的接口上转发数据报文。至于数据报文在路由器之间如何转发则由路由协议决定,不是 IGMP 协议的功能。

2.3.2二层环境中组成员管理的实现
IGMP 组播成员管理机制是针对第三层设计的,在第三层,路由器可以对组播报文的转发进行控制,只要进行适当的接口配置和对 TTL 值的检测就可以了。但是在很多情况下,组播报文要不可避免地经过一些二层交换设备,尤其是在局域网环境里。如果不对二层设备进行相应的配置,则组播报文就会转发给二层交换设备的所有接口,这显然会浪费大量的系统资源。IGMP 监听(IGMP Snooping)可以解决这个问题。

IGMP 监听的工作原理如下:

主机发出 IGMP 成员报告消息,这个消息是给路由器的;在 IGMP 成员报告经过交换机时,交换机对这个消息进行监听并记录下来,形成组成员和接口的对应关系;

交换机在收到组播数据报文时,根据组成员和接口的对应关系,仅向具有组成员的接口转发组播报文。

IGMP 监听可以解决二层环境中的组播报文泛滥问题,但要求交换机具有提取第三层信息的功能;其次,要求交换机对所有的组播报文进行监听和解读,这会产生很多的无效工作;此外,组播报文监听和解读工作也会占用大量的 CPU 处理时间。

2.4组播报文转发
与单播报文的转发相比,组播报文的转发相对复杂。一方面,组播路由类型与单播路由不同,是点到多点的一棵路由树;另一方面组播报文转发的处理过程也有所不同。

2.4.1组播路由的分类
组播路由可以分为两大类:信源树(Source Tree)和共享树(Shared Tree)。信源树是指以组播源作为树根,将组播源到每一个接收者的最短路径结合起来构成的转发树。由于信源树使用的是从组播源到接收者的最短路径,因此也称为最短路径树(shor*** path tree,SPT)。对于某个组,网络要为任何一个向该组发送报文的组播源建立一棵树。 共享树以某个路由器作为路由树的树根,该路由器称为汇集点(Rendezvous Point,RP),将 RP 到所有接收者的最短路结合起来构成转发树。使用共享树时,对应某个组,网络中只有一棵树。所有的组播源和接收者都使用这棵树来收发报文,组播源先向树根发送数据报文,之后报文又向下转发到达所有的接收者。

信源树的优点是能构造组播源和接收者之间的最短路径,使端到端的延迟达到最小;但是付出的代价是,在路由器中必须为每个组播源保存路由信息,这样会占用大量的系统资源,路由表的规模也比较大。共享树的最大优点是路由器中保留的状态数可以很少,缺点是组播源发出的报文要先经过 RP,再到达接收者,经由的路径通常并非最短,而且对 RP 的可靠性和处理能力要求很高。

2.4.2组播报文转发过程
单播报文的转发过程中,路由器并不关心组播源地址,只关心报文中的目的地址,通过目的地址决定向哪个接口转发。在组播中,报文是发送给一组接收者的,这些接收者用一个逻辑地址标识。路由器在接收到报文后,必须根据源和目的地址确定出上游(指向组播源)和下游方向,把报文沿着远离组播源的方向进行转发。这个过程称作 RPF(Reverse Path Forwarding,逆向路径转发)。

RPF 执行过程中会用到原有的单播路由表以确定上游和下游的邻接结点。只有当报文是从上游邻接结点对应的接口(称作 RPF 接口)到达时,才向下游转发。RPF 的作用除了可以正确地按照组播路由的配置转发报文外,还能避免由于各种原因造成的环路,环路避免在组播路由中是一个非常重要的问题。RPF 的主体是 RPF 检查,路由器收到组播报文后,先对报文进行 RPF 检查,只有检查通过才转发,否则丢弃。RPF 检查过程如下:

1)路由器在单播路由表中查找组播源或 RP 对应的 RPF 接口(当使用信源树时,查找组播源对应的 RPF 接口,使用共享树时查找 RP 对应的 RPF 接口),某个地址对应的 RPF 接口是指从路由器向该地址发送报文时的出接口;

2)如果组播报文是从 RPF 接口接收下来的,则 RPF 检查通过,报文向下游接口转发;

3)否则,丢弃该报文。

2.5域内组播路由协议
与单播路由一样,组播路由也分为域内和域间两大类。域内组播路由目前已经讨论的相当成熟,在众多的域内路由协议中,DVMRP(距离矢量组播路由协议)、PIM-DM(密集模式协议无关组播)和PIM-SM(稀疏模式协议无关组播)是目前应用最多的协议。

2.5.1DVMRP(Distance Vector Multicast Routing Protocol)
DVMRP 是第一个在 MBONE 上得到普遍使用的组播路由协议,它在 RIP 协议的基础上扩充了支持组播的功能。DVMRP 协议首先通过发送探测消息来进行邻居发现,之后通过路由交换来进行单播寻径和确定上下游依赖关系。

DVMRP 采用逆向路径组播(RPM)算法进行组播转发。当组播源第一次发送组播报文时,使用截断逆向路径组播(truncated RPM)算法沿着源的组播分发树向下转发组播报文。当叶子路由器不再需要组播数据包时,它朝着组播源发送剪枝消息,对组播分发树进行剪枝,借此除不必要的通信量。上游路由器收到剪枝消息后将收到此消息的接口置为剪枝状态,停止转发数据。剪枝状态关联着超时定时器,当定时器超时时,剪枝状态又重新变为转发状态,组播数据再次沿着这些分支流下。另外,当剪枝区域内出现了组播组成员时,为了减少反应时间,下游不必等待上游剪枝状态超时,而是主动向上游发送嫁接报文,以使剪枝状态变为转发状态。可见,DVMRP 是由数据触发驱动,建立组播路由表,而路由树的建立过程可以概括为“扩散与剪枝”(Broadcast and Prune)。转发特点可以概括为“被动接受,主动退出”。

另外,在多路访问网络中,当有两个或多个的组播路由器时,网络上可能会重复转发包。为了防止这种情况出现,在多路访问网络上,DVMRP 为每个源选择了一个唯一的转发器。

2.5.2PIM-DM(Protocol Independent Multicast Dense Mode)
在 PIM-DM 域中,运行 PIM-DM 协议的路由器周期性的发送 Hello 消息,发现邻接的 PIM 路由器,进行叶子网络、叶子路由器的判断,并且负责在多路访问网络中选举指定路由器(DR)。

PIM-DM 协议使用下面的假设:当组播源开始发送组播数据时,域内所有的网络节点都需要接收数据,因此采用“扩散-剪枝”的方式进行组播数据包的转发。组播源开始发送数据时,沿途路由器向除组播源对应的 RPF 接口之外的所有接口转发组播数据包。这样,PIM-DM 域中所有网络节点都会收到这些组播数据包。为了完成组播转发,沿途的路由器需要为组 G 和源 S 创建相应的组播路由项 (S, G)。 (S, G) 路由项包括组播源地址、组播组地址、入接口、出接口列表、定时器和标志等。

如果网络中某区域没有组播组成员,该区域内的路由器会发送剪枝消息,将通往该区域的转发接口剪枝,并且建立剪枝状态。剪枝状态对应着超时定时器。当定时器超时时,剪枝状态又重新变为转发状态,组播数据得以再次沿着这些分支流下。另外,剪枝状态包含组播源和组播组的信息。当剪枝区域内出现了组播组成员时,为了减少反应时间,协议不必等待上游剪枝状态超时,而是主动向上游发送嫁接报文,以使剪枝状态变为转发状态。

2.5.3PIM-SM(Protocol Independent Multicast Sparse Mode)
在 PIM-SM 域中,运行 PIM-SM 协议的路由器周期性的发送 Hello 消息,用以发现邻接的 PIM 路由器,并且负责在多路访问网络中进行 DR 的选举。这里,DR 负责为与其直连的组成员向组播树根节点的方向发送“加入/剪枝”消息,或是将直连组播源的数据发向组播分发树。

PIM-SM 通过建立组播分发树来进行组播数据包的转发。组播分发树分为两种:以组 G 的 RP 为根的共享树和以组播源为根的最短路径树。PIM-SM 通过显式的加入/剪枝机制来完成组播分发树的建立与维护。

PIM-SM 中还涉及到 RP 的选择机制。在 PIM-SM 域内配置了一个或多个候选自举路由器(Candidate-BSR)。使用一定的规则从中选出自举路由器 (BSR) 。PIM-SM 域中还配置有候选 RP 路由器(Candidate-RP),这些候选 RP 将包含了它们地址及可以服务的组播组等信息的报文单播发送给自举路由器,再由 BSR 定期生成包括一系列候选 RP 以及相应的组地址的“自举”消息。“自举”消息在整个域中逐跳发送。路由器接收并保存这些“自举”消息。若 DR 从直连主机收到了 IGMP 加入报文后,如果它没有这个组的路由项,将使用 hash 算法将组地址映射到一个候选 RP。然后朝 RP 方向逐跳组播“加入/剪枝”消息。若 DR 从直连主机收到组播数据包,如果它没有这个组的路由项,也将使用 hash 算法将组地址映射到一个候选 RP,然后将组播数据封装在注册消息中单播发送到 RP。

在多路访问网络中,PIM-SM 还引入了以下机制:使用断言机制选举唯一的转发者,以防向同一网段重复转发组播数据包;使用加入/剪枝抑制机制减少冗余的加入/剪枝消息;使用剪枝否决机制否决不应有的剪枝行为。

2.6域间组播路由协议
域间组播目前仍然处于研究和试验阶段,目前比较成型的解决方案是下面三个协议的组合:

MBGP(组播边界网关协议),用于在自治域之间交换组播路由信息;MSDP(组播信源发现协议),用于在 ISP 之间交换组播信源信息;PIM-SM,用作域内的组播路由协议。

PIM-SM 前文已经介绍,这里重点介绍 MBGP 和 MSDP,以及 PIM-SM / MBGP / MSDP 组合方案的工作过程。

2.6.1MBGP(MultiProtocol Border Gateway Protocol)
域间路由的首要问题是路由信息(或者说可达信息)如何在自治系统之间传递,由于不同的 AS 可能属于不同的运营商,因此除了距离信息外,域间路由信息必须包含运营商的策略,这是与域内路由信息的不同之处。

目前使用最多的域间单播路由协议是 BGP-4。为了实现域间组播路由信息的传递,必须对 BGP 进行改动,因为组播的网络拓扑和单播拓扑有可能不同。这里既有物理方面的原因,也有策略方面的原因。网络中的一些路由器可能只支持单播不支持组播,也可能按照策略配置不转发组播报文。为了构造域间组播路由树,除了要知道单播路由信息外,还要知道网络中哪些部分是支持组播的,即组播的网络拓扑情况。简而言之,域间的组播路由信息交换协议应该满足下面的要求:

能对单播和组播拓扑进行区分;

有一套稳定的对等和策略控制方法。

BGP-4 已经满足后一个条件,而且已经被证明是一个有效的、稳定的单播域间路由协议,因此合理的解决方案是对 BGP-4 协议进行增强和扩展,而不是构建一套全新的协议。在 RFC2858 中规定了对 BGP 进行多协议扩展的方法,扩展后的 BGP 协议(MBGP,也写作 BGP-4+)不仅能携带 IPv4 单播路由信息,也能携带其它网络层协议(如组播、IPv6 等)的路由信息,携带组播路由信息只是其中一个扩展功能。

有了 MBGP 之后,单播和组播路由信息可以通过同一个进程交换,但是存放在不同的路由表里。由于 MBGP 是 BGP-4 协议的一个增强版,因此 BGP-4 所支持的常见的策略和配置方法都可以用到组播里。

2.6.2MSDP(Multicast Source Discovery Protocol)
对于 ISP 来说,不希望依靠竞争对手的 RP 转发组播流量,但同时又要求无论信源的 RP 在哪里,都能从信源获取信息发给自己内部的成员。MSDP 就是为了解决这个问题而提出的。在 MSDP 里使用的是域间信源树而不是公共树,而且要求域内组播路由协议必须是 PIM-SM。

在 MSDP 中,某个域内的 RP 使用 TCP 连接与其它域内的 RP 建立 MSDP 对等关系,用这些对等关系交换信源信息。如果本地的接收者要接收其它域的信源发出的报文,则使用与 PIM-SM 中同样的方法构造信源树。

PIM-SM / MBGP / MSDP 组合方案实际上是 PIM-SM 协议在域间环境下的扩展。如果把整个 PIM-SM / MBGP / MSDP 组合方案机制看作 PIM-SM,则所有域的 RP 的集合就是 PIM-SM 协议中的“RP”,而 PIM-SM / MBGP / MSDP 无非是增加了两个过程:

1、信源信息在 RP 集合中的泛滥,以实现信源和成员在“RP”点的会合;

2、域间组播路由信息的传递,目的是保证组播报文在域间的顺利转发。在上述过程中,AS3 中的 RP 和收端向 AS2 中的远端建立逆向路径的过程中都需要用到 MBGP 传递的组播拓扑信息。

❼ 最短路径和最小生成树分别对应什么算法,两者区别是什

最小生成树是用和最少的边集将一个图连成任意2点可达,并且这个边集的总长度最小。最短路径是一个图中2个点的最短距离。完全不是一个概念。

那也不一样啊,一点到其余各点的路径和最小,就是一点到其它点的最短路径和。差的太远了。

比如这样一个图(边权已标出)
******4
*****v--v
****5 \ / 3
*******v
****2 / \ 4
*****v v
最小生成树为
****v--v
******/
*****v
****/ \
***v v
总长为4+3+2+4=13

中间那个点到各点的最短路径为5+2+3+4=14
显然不一样啊,反例太多了,举了一种。

❽ 链路状态路由协议运行什么算法来计算到达目的网络的最短路径

一、RIP协议RIP(RoutinginformationProtocol)是应用较早、使用较普遍的内部网关协议(InteriorGatewayProtocol,简称IGP),适用于小型同类网络,是典型的距离向量(distance-vector)协议。文档见RFC1058、RFC1723。RIP通过广播UDP报文来交换路由信息,每30秒发送一次路由信息更新。RIP提供跳跃计数(hopcount)作为尺度来衡量路由距离,跳跃计数是一个包到达目标所必须经过的路由器的数目。如果到相同目标有二个不等速或不同带宽的路由器,但跳跃计数相同,则RIP认为两个路由是等距离的。RIP最多支持的跳数为15,即在源和目的网间所要经过的最多路由器的数目为15,跳数16表示不可达。1.有关命令任务命令指定使用RIP协议routerrip指定RIP版本version{1|2}1指定与该路由器相连的网络networknetwork注:1.Cisco的RIP版本2支持验证、密钥管理、路由汇总、无类域间路由(CIDR)和变长子网掩码(VLSMs)二、IGRP协议IGRP()是一种动态距离向量路由协议,它由Cisco公司八十年代中期设计。使用组合用户配置尺度,包括延迟、带宽、可靠性和负载。缺省情况下,IGRP每90秒发送一次路由更新广播,在3个更新周期内(即270秒),没有从路由中的第一个路由器接收到更新,则宣布路由不可访问。在7个更新周期即630秒后,CiscoIOS软件从路由表中清除路由。1.有关命令任务命令指定使用RIP协议routerigrpautonomous-system1指定与该路由器相连的网络networknetwork指定与该路由器相邻的节点地址neighborip-address注:1、autonomous-system可以随意建立,并非实际意义上的autonomous-system,但运行IGRP的路由器要想交换路由更新信息其autonomous-system需相同。三、OSPF协议OSPF(OpenShortestPathFirst)是一个内部网关协议(InteriorGatewayProtocol,简称IGP),用于在单一自治系统(autonomoussystem,AS)内决策路由。与RIP相对,OSPF是链路状态路有协议,而RIP是距离向量路由协议。链路是路由器接口的另一种说法,因此OSPF也称为接口状态路由协议。OSPF通过路由器之间通告网络接口的状态来建立链路状态数据库,生成最短路径树,每个OSPF路由器使用这些最短路径构造路由表。文档见RFC2178。1.有关命令全局设置任务命令指定使用OSPF协议routerospfprocess-id1指定与该路由器相连的网络networkaddresswildcard-maskareaarea-id2指定与该路由器相邻的节点地址neighborip-address注:1、OSPF路由进程process-id必须指定范围在1-65535,多个OSPF进程可以在同一个路由器上配置,但最好不这样做。多个OSPF进程需要多个OSPF数据库的副本,必须运行多个最短路径算法的副本。process-id只在路由器内部起作用,不同路由器的process-id可以不同。2、wildcard-mask是子网掩码的反码,网络区域IDarea-id在0-4294967295内的十进制数,也可以是带有IP地址格式的x.x.x.x。当网络区域ID为0或0.0.0.0时为主干域。不同网络区域的路由器通过主干域学习路由信息。

❾ sh实现最小生成树和最短路径的算法

图的最小生成树与最短路径的算法

一、图的生成树与最小生成树
在一个连通图G中,如果取它的全部顶点和一部分边构成一个子图G’,即:

若边集E(G’)中的边既将图中的所有顶点连通又不形成回路,则称子图G’是原图G的一棵生成树。
最小生成树:给图中每个边赋一权值,所有生成树中所选择边的权值之和最小的生成树,称之为最小代价生成树,即是最小生成树。

1、普里姆算法
1.1算法描述
假设G=(V, E)是一个具有n个顶点的连通网,T=(U, TE)是G的最小生成树,其中U是T的顶点集,TE是T的边集,U和TE的初值均为空集。算法开始时,首先从V中任取一个顶点(假定取v1),将它并入U中,此时U={v1},然后只要U是V的真子集(即),就从那些其一个端点已在T中,另一个端点仍在T外的所有边中,找一条最短(即权值最小)边,假定为(vi, vj),其中,并把该边(vi, vj)和顶点vj分别并入T的边集TE和顶点集U,如此进行下去,每次往生成树里并入一个顶点和一条边,直到(n-1)次后就把所有n个顶点都并入到生成树T的顶点集中,此时U=V,TE中含有(n-1)条边,T就是最后得到的最小生成树。 1.2关键问题
普里姆算法的关键之处是:每次如何从生成树T中到T外的所有边中,找出一条最短边。例如,在第k次前,生成树T中已有k个顶点和(k-1)条边,此时T中到T外的所有边数为k(n-k),当然它包括两顶点间没有直接边相连,其权值被看作为“无穷大”的边在内,从如此多的边中查找最短边,其时间复杂性为O(k(n-k)),显然是很费时的。是否有一种好的方法能够降低查找最短边的时间复杂性呢? 1.3 解决方法
方法是:假定在进行第k次前已经保留着从T中到T外每一顶点(共(n-k)个顶点)的各一条最短边,进行第k次时,首先从这(n-k)条最短边中,找出一条最最短的边(它就是从T中到T外的所有边中的最短边),假设为(vi, vj),此步需进行(n-k)次比较;然后把边(vi, vj)和顶点vj分别并入T中的边集TE和顶点集U中,此时T外只有n-(k+1)个顶点,对于其中的每个顶点vt,若(vj, vt)边上的权值小于已保留的从原T中到vt的最短边的权值,则用(v, vt)修改之,使从T中到T外顶点vt的最短边为(vj, vt),否则原有最短边保持不变,这样,就把第k次后从T中到T外每一顶点vt的各一条最短边都保留下来了。为进行第(k+1)次运算做好了准备,此步需进行(n-k-1)次比较。所以,利用此方法求第k次的最短边共需比较2(n-k)-1次,即时间复杂性为O(n-k)。
1.4 prim算法:
设一个辅助数组closedge,以记录从U到V—U具有最小代价的边。数组中的每个元素closedge[v]是记录类型,包含两个域: closedge[v].lowcast=Min{cost(u,v)|u∈U}; closedge[v].vex存储该边依附的在U中的顶点。
proc mintree_prim(gn:adjmatrix;u0:integer);
begin
for v:=1 to n do
if v<>u0 then
with closedage[v] do [vex:=u0; lowcast:=gn[u0,v];]
closedge[u0].lowcast:=0;{并入U集合}
for i:=1 to n-1 do
begin
v:=min(closedge);{寻找代价最小的边}
write(closedge[v].vex,v); closedge[v].lowcast:=0;{并入U集合}
for k:=1 to n do
if gn[v,k]<closedge[k].lowcast then
begin closedge[k].lowcast:=gn[v,k]; closedge[k].vex:=v; end;
end;
end; 练习1:prim算法实现
【问题描述】从文件中读入连通带权图的信息,按prim算法求出该图的最小生成树,以V1作为初始结点。
【输入文件】第一行两个整数m和n,分别表示图的结点数和图中的边数。以下n行表示n条边:每一行三个数x、y和k,k表示x与y之间边的权值。
【输出文件】共m行,第一行:最小生成树的权;以下m-1行表示选取的边,边的第1个结点小于第2个结点,并按结点由小到大输出。
【示例】输入:5 7 输出:45
1 2 17 1 4
2 3 30 1 5
1 4 5 2 4
2 4 10 3 5
3 4 24
3 5 7
1 5 23

练习2: Eddy painting
Eddy begins to like painting pictures recently ,he is sure of himself to become a painter.Every day Eddy draws pictures in his small room, and he usually puts out his newest pictures to let his friends appreciate. but the result it can be imagined, the friends are not interested in his picture.Eddy feels very puzze,in order to change all friends 's view to his technical of painting pictures ,so Eddy creates a problem for the his friends of you.
Problem descriptions as follows: Given you some coordinates pionts on a drawing paper, every point links with the ink with the straight line, causes all points finally to link in the same place. How many distants does your ty discover the shortest length which the ink draws?
Input:
The first line contains 0 < n <= 100, the number of point. For each point, a line follows; each following line contains two real numbers indicating the (x,y) coordinates of the point.

Input contains multiple test cases. Process to the end of file.
Output:
Your program prints a single real number to two decimal places: the minimum total length of ink lines that can connect all the points.
Sample Input:
3
1.0 1.0
2.0 2.0
2.0 4.0
Sample Output:
3.41

2、克鲁斯卡尔算法
2.1 算法描述
假设G=(V,E)是一个具有n个顶点的连通网,T=(U,TE)是G的最小生成树,U的初值等于V,即包含有G中的全部顶点,TE的初值为空。此算法的基本思想是,将图G中的边按权值从小到大的顺序依次选取,若选取的边使生成树T不形成回路,则把它并入TE中,保留作为T的一条边,若选取的边使生成树T形成回路,则将其舍弃,如此进行下去,直到TE中包含有n-1条边为止。此时的T即为最小生成树。
2.2 关键问题
克鲁斯卡尔算法的关键之处是:如何判断欲加入的一条边是否与生成树中已选取的边形成回路。这可将各顶点划分为所属集合的方法来解决,每个集合中的顶点表示一个无回路的连通分量。算法开始时,由于生成树的顶点集等于图G的顶点集,边集为空,所以n个顶点分属于n个集合。每个集合中只有一个顶点,表明顶点之问互不连通。
2.3 Kruskal算法:
proc mintree_krusk(gn:adjmatrix);
begin
for i:=1 to n do
un[i]:=i;
for i:=1 to n-1 do
begin
minedge(a,b);
write(a,b,gn[a,b]);
k:=un[b];
for i:=1 to n do {两个连通分量合并}
if un[i]=k then un[i]:=un[a];
end;
end;
2.4 注意:
proc minedge(var a:integer;var b:integer);用于在剩下的边中选取不再同一连通分量上的最小代价的边,边的结点分别为a和b。
为了实现该过程,可以将图中的边生成一边结点(包含两个顶点和代价)数组,由小到大排序,然后通过排序后的数组进行处理;
un数组:用来记载随着边的加入,各顶点属于哪个连通分量。
练习3:Kruskal算法实现
【问题描述】从文件中读入连通带权图的信息,按Kruskal算法求出该图的最小生成树,以V1作为初始结点。
【输入文件】第一行两个整数m和n,分别表示图的结点数和图中的边数。以下n行表示n条边:每一行三个数x、y和k,k表示x与y之间边的权值。
【输出文件】共m行,第一行:最小生成树的权;以下m-1行表示选取的边,按选取边的权值由小到大输出。
【示例】输入:5 7 输出:45
1 2 17 1 4
2 3 30 3 5
1 4 5 2 4
2 4 10 1 5
3 4 24
3 5 7
1 5 23

练习4:判断最小生成树是否唯一
Given a connected undirected graph, tell if its minimum spanning tree is unique.
Definition 1 (Spanning Tree): Consider a connected, undirected graph G = (V, E). A spanning tree of G is a subgraph of G, say T = (V', E'), with the following properties:
1. V' = V.
2. T is connected and acyclic.

Definition 2 (Minimum Spanning Tree): Consider an edge-weighted, connected, undirected graph G = (V, E). The minimum spanning tree T = (V, E') of G is the spanning tree that has the smallest total cost. The total cost of T means the sum of the weights on all the edges in E'.
Input
The first line contains a single integer t (1 <= t <= 20), the number of test cases. Each case represents a graph. It begins with a line containing two integers n and m (1 <= n <= 100), the number of nodes and edges. Each of the following m lines contains a triple (xi, yi, wi), indicating that xi and yi are connected by an edge with weight = wi. For any two nodes, there is at most one edge connecting them.
Output
For each input, if the MST is unique, print the total cost of it, or otherwise print the string 'Not Unique!'.
Sample Input
2
3 3
1 2 1
2 3 2
3 1 3
4 4
1 2 2
2 3 2
3 4 2
4 1 2
Sample Output
3
Not Unique!

二、最短路径
【问题描述】由于从一顶点到另一顶点可能存在着多条路径。每条路径上所经过的边数可能不同,即路径长度不同,我们把路径长度最短(即经过的边数最少)的那条路径叫做最短路径,其路径长度叫做最短路径长度或最短距离。求图中一顶点vi到其余各顶点的最短路径和最短距离比较容易,只要从该顶点vi,出发对图进行一次广度优先搜索遍历,在遍历时记下每个结点的层次即可。
若图是带权图(假定权值非负)从源点vi到终点vj的每条路径上的权(它等于该路径上所经边上的权值之和,称为该路径的带权路径长度)可能不同,我们把权值最小的那条路径也称做最短路径,其权值也称作最短路径长度或最短距离。
实际上,这两类最短路径问题可合并为一类,这只要把第一类的每条边的权都设为1就归属于第二类了,所以在以后的讨论中,若不特别指明,均是指第二类的最短路径问题。
求图的最短路径问题包括两个子问题:一是求图中一顶点到其余各顶点的最短路径,二是求图中每对顶点之间的最短路径。下面分别进行讨论。
始点 终点 最短路径 路径长度
v0 v1 No path
v2 (v0,v2) 10
v3 (v0,v4,v3) 50
v4 (v0,v4) 30
v5 (v0,v4,v3,v5) 60

始点 终点 最短路径 路径长度
v1 V2 (v1,v2) 10
V3 (v1,v2,v3) 27
V4 (v1,v5,v4) 20
v5 (v1,v5) 7

1、从一顶点到其余各顶点的最短路径
1.1 描述
迪杰斯特拉(Dijkstra)于1959年提出了解决此问题的一般算法,具体做法是按照从源点到其余每一顶点的最短路径长度的升序依次求出从源点到各顶点的最短路径及长度,每次求出从源点vi到一个终点vj的最短路径及长度后,都要以vj作为新考虑的中间点,用vi到vj的最短路径和最短路径长度对vi到其它尚未求出最短路径的那些终点的当前路径及长度作必要的修改,使之成为当前新的最短路径和最短路径长度,当进行n-2次后算法结束。
1.2 Dijkstra算法:
首先,引进一个辅助向量dist,dist[i]表示当前所找到的从始点V到每个终点Vi的最短路径长度。其初态为:若<v,vi>存在,则dist[i]为其上的权值,否则为最大值(计算机能表示)。
算法:(1)用邻接矩阵cost表示带权有向图。S表示已找到的从v出发的最短路径的终点的集合,初态为空。dist向量的初值为:dist[v,i]=cost[v,i];
(2)选择vj,使得:dist[j]=Min{dist[i]|vi∈V-S};vj就是当前求得从v出发的最短路径的终点。
S=S+{j};
(3)修改从v出发到集合V-S上任意顶点vk可达的最短路径长度。
if dist[j]+cost[j,k]<dist[k] then dist[k]:=dist[j]+cost[j,k];
(4)重复(2)(3)共n-1次。
代码:proc short_dij;
begin
for i:=1 to n do
begin
dist[i]:=cost[v0,i];
if dist[i]<max then path[i]:=v0 else path[i]:=-1; end;
flag[I]:=true;
for k:=1 to n-1 do
begin
wm:=max; j:=v0;
for i:=1 to n do
if not(flag[i]) and (dist[i]<wm) then begin j:=i; m:=dist[i]; end;
flag[j]:=true; for i:=1 to n do if not(flag[i]) and (dist[j]+cost[j,i]<dist[i]) then
begin dist[i]:=dist[j]+cost[j,i]; path[i]:=j; end;
end;
end; 其中:cost:邻接矩阵;
path[i]:存储从v0到顶点i的最短路径;是以集合作为数组元素;
dist[i]:存储相应路径长度;
flag[i]:表示已处理的顶点。
练习5:Dijkstra算法练习
【问题描述】从文件中读入带权图的信息,按Dijkstra算法根据给定源点求出从源点法到该图中其余顶点的最短路径。
【输入文件】第一行:一个整数L:L=0表示无向图,L=1表示有向图;第二行三个整数m、n和k,分别表示图的结点数、图中的边数以及源点。以下n行表示n条边:每一行三个数x、y和z,z表示x与y之间边的权值。
【输出文件】共m-1行,每一行的数据包括:顶点: 最短路径:路径,如果不存在路径,数据为:顶点:No path。
【示例】输入:1 输出:2:No path
6 8 1 3:10:1 3
1 3 10 4:50:1 5 4
1 5 30 5:30:1 5
1 6 100 6:60:1 5 4 6
2 3 5
3 4 50
4 6 10
5 4 20
5 6 60
练习6:路由选择问题
【问题描述】
X城有一个含有N个节点的通信网络,在通信中,我们往往关心信息从一个节点I传输到节点J的最短路径。遗憾的是,由于种种原因,线路中总有一些节点会出故障,因此在传输中要避开故障节点。
任务一:在己知故障节点的情况下,求避开这些故障节点,从节点I到节点J的最短路径S0。
任务二:在不考虑故障节点的情况下,求从节点I到节点J的最短路径S1、第二最短路径S2。
【输入文件】
第1行: N I J (节点个数 起始节点 目标节点)
第2—N+1行: Sk1 Sk2…SkN (节点K到节点J的距离为SkJ K=1,2,……,N)
最后一行: P T1 T2……Tp (故障节点的个数及编号)
【输出文件】
S0 S1 S2 (S1<=S2 从节点I到节点J至少有两条不同路径)
【输入输出样例】
route.in
5 1 5
0 10 5 0 0
10 0 0 6 20
5 0 0 30 35
0 6 30 0 6
0 20 35 6 0
1 2
route.out
40 22 30

2、每对顶点之间的最短路径
求图中每对顶点之间的最短路径是指把图中任意两个顶点vi和vj(i≠j)之间的最短路径都计算出来。解决此问题有两种方法:一是分别以图中的每个顶点为源点共调用n次迪杰斯特拉算法,此方法的时间复杂性为O(n3);二是采用下面介绍的弗洛伊德(Floyed)算法,此算法的时间复杂性仍为O(n3),但比较简单。 弗洛伊德算法实际上是一个动态规划的算法。从图的邻接矩阵开始,按照顶点v1,v2,…,vn的次序,分别以每个顶点vk(1≤k≤n)作为新考虑的中间点,在第k-1次运算Ak-1 (A(0)为原图的邻接矩阵G) 的基础上,求出每对顶点vi到vj的最短路径长度计算公式为:

Floyd算法:
proc shortpath_floyd;
begin
for i:=1 to n do for j:=1 to n do
begin
length[i,j]:=cost[i,j];
if length[i,j]<max then path[i,j]:=[i]+[j];
end;
for k:=1 to n do for i:=1 to n do for j:=1 to n do
if length[i,k]+length[k,j]<length[i,j] then
begin
length[i,j]:=length[i,k]+length[k,j];
path[i,j]:=path[i,k]+path[k,j];
end;
end;
其中:cost为邻接矩阵;
path[i,j]:表示顶点i到j的最短路径;
length[i,j]:
练习7:Floyd算法练习
【问题描述】从文件中读入带权图的信息,按Dijkstra算法根据给定源点求出从源点到该图中其余顶点的最短路径。
【输入文件】第一行:一个整数L:L=0表示无向图,L=1表示有向图;第二行三个整数m、n,分别表示图的结点数和图中的边数。以下n行表示n条边:每一行三个数x、y和z,z表示x与y之间边的权值。第n+2行:整数R,以下R行每行一个整数表示顶点标号作为源点。
【输出文件】共R行,每一行的数据表示源点到其余顶点的距离,按顶点编号由小大输出,如果没有路径,输出-1。
【示例】输入:1 输出:-1 10 50 30 60
6 8 -1 –1 –1 20 30
1 3 10
1 5 30
1 6 100
2 3 5
3 4 50
4 6 10
5 4 20
5 6 60
2
1
5

阅读全文

与最短路径树算法相关的资料

热点内容
饥荒安卓闪退怎么办 浏览:635
python二次开发cad 浏览:304
程序员直播机器人舞团 浏览:769
devc指针编译问题 浏览:1002
支持dsd硬解压声卡 浏览:771
怎么查看u盘加密区 浏览:184
台电加密是什么格式 浏览:158
php论坛版块在哪个文件夹 浏览:442
暗黑的服务器为什么维护 浏览:624
android内存溢出的原因 浏览:18
标志307的压缩比是多少 浏览:636
服务器启动为什么叫三声 浏览:997
追风筝的人英文pdf 浏览:940
解压小熊手机壳 浏览:348
成都市区建成面积算法 浏览:662
智能家居单片机 浏览:98
买男装用什么app好 浏览:857
文件夹合并了怎么拆开 浏览:262
波段副图源码无未来函数 浏览:91
livecn服务器地址 浏览:259