搜档网
当前位置:搜档网 › 生成树(Spanning Tree Protocol)

生成树(Spanning Tree Protocol)

生成树(Spanning Tree Protocol)
生成树(Spanning Tree Protocol)

生成树(Spanning Tree Protocol)

1. STP的用途

STP(Spanning Tree Protocol,生成树协议)是根据IEEE协会制定的802.1D标准建立的,用于在局域网中消除数据链路层物理环路的协议。运行该协议的设备通过彼此交互信息发现网络中的环路,并有选择的对某些端口进行阻塞,最终将环路网络结构修剪成无环路的树型网络结构,从而防止报文在环路网络中不断增生和无限循环,避免设备由于重复接收相同的报文造成的报文处理能力下降的问题发生。

STP包含了两个含义,狭义的STP是指IEEE 802.1D中定义的STP协议,广义的STP是指包括IEEE 802.1D 定义的STP协议以及各种在它的基础上经过改进的生成树协议。

2. STP的协议报文

STP采用的协议报文是BPDU(Bridge Protocol Data Unit,桥协议数据单元),也称为配置消息。

STP通过在设备之间传递BPDU来确定网络的拓扑结构。BPDU中包含了足够的信息来保证设备完成生成树的计算过程。

BPDU在STP协议中分为两类:

◆配置BPDU(Configuration BPDU):用来进行生成树计算和维护生成树拓扑的报文。

◆ TCN BPDU(Topology Change Notification BPDU):当拓扑结构发生变化时,用来通知相关设备网络拓扑结构发生变化的报文。

3. STP的基本概念

(1)根桥

树形的网络结构,必须要有树根,于是STP引入了根桥(Root Bridge)的概念。

根桥在全网中只有一个,而且根桥会根据网络拓扑的变化而改变,因此根桥并不是固定的。

网络收敛后,根桥会按照一定的时间间隔产生并向外发送配置BPDU,其它的设备对该配置BPDU进行转发,从而保证拓扑的稳定。

(2)根端口

所谓根端口,是指一个非根桥的设备上离根桥最近的端口。根端口负责与根桥进行通信。非根桥设备上有且只有一个根端口。根桥上没有根端口。

(3)指定桥与指定端口

指定桥与指定端口的含义,请参见表1的说明。

表1 指定桥与指定端口的含义

指定桥与指定端口如图1所示,AP1、AP2、BP1、BP2、CP1、CP2分别表示设备Device A、Device B、Device C的端口。

◆ Device A通过端口AP1向Device B转发配置消息,则Device B的指定桥就是Device A,指定端口就是Device A的端口AP1;

◆与局域网LAN相连的有两台设备:Device B和Device C,如果Device B负责向LAN转发配置消息,则LAN的指定桥就是Device B,指定端口就是Device B的BP2。

图1 指定桥与指定端口示意图

说明:

根桥上的所有端口都是指定端口。

(4)路径开销

路径开销是STP协议用于选择链路的参考值。STP协议通过计算路径开销,选择较为“强壮”的链路,阻塞多余的链路,将网络修剪成无环路的树型网络结构。

4. STP的基本原理

STP通过在设备之间传递BPDU来确定网络的拓扑结构。配置消息中包含了足够的信息来保证设备完成生成

树的计算过程,其中包含的几个重要信息如下:

◆根桥ID:由根桥的优先级和MAC地址组成;

◆根路径开销:到根桥的最短路径开销;

◆指定桥ID:由指定桥的优先级和MAC地址组成;

◆指定端口ID:由指定端口的优先级和端口名称组成;

◆配置消息在网络中传播的生存期:Message Age;

◆配置消息在设备中能够保存的最大生存期:Max Age;

◆配置消息发送的周期:Hello Time;

◆端口状态迁移的延时:Forward Delay。

说明:

为描述方便,在下面的描述及举例中仅考虑配置消息的其中四项内容:

◆根桥ID(以设备的优先级表示);

◆根路径开销;

◆指定桥ID(以设备的优先级表示);

◆指定端口ID(以端口名称表示)。

(1) STP算法实现的具体过程

◆初始状态

各台设备的各个端口在初始时会生成以自己为根桥的配置消息,根路径开销为0,指定桥ID为自身设备ID,指定端口为本端口。

◆最优配置消息的选择

各台设备都向外发送自己的配置消息,同时也会收到其它设备发送的配置消息。

最优配置消息的选择过程如表2所示。

表2 最优配置消息的选择过程

说明:

配置消息的比较原则如下:

◆根桥ID较小的配置消息优先级高;

◆若根桥ID相同,则比较根路径开销,比较方法为:用配置消息中的根路径开销加上本端口对应的路径开销,假设两者之和为S,则S较小的配置消息优先级较高;

◆若根路径开销也相同,则依次比较指定桥ID、指定端口ID、接收该配置消息的端口ID等,上述值较小的配置消息优先级较高。

◆根桥的选择

网络初始化时,网络中所有的STP设备都认为自己是“根桥”,根桥ID为自身的设备ID。通过交换配置消息,设备之间比较根桥ID,网络中根桥ID最小的设备被选为根桥。

◆根端口、指定端口的选择

根端口、指定端口的选择过程如表3所示。

表3 根端口和指定端口的选择过程

说明:

在拓扑稳定状态,只有根端口和指定端口转发流量,其它的端口都处于阻塞状态,它们只接收STP协议报文而不转发用户流量。

一旦根桥、根端口、指定端口选举成功,则整个树形拓扑就建立完毕了。

下面结合例子说明STP算法实现的计算过程。具体的组网如图2所示,Device A的优先级为0,Device B 的优先级为1,Device C的优先级为2,各个链路的路径开销分别为5、10、4。

图2 STP算法计算过程组网图

◆各台设备的初始状态

各台设备的初始状态如表4所示。

表4 各台设备的初始状态

◆各台设备的比较过程及结果

各台设备的比较过程及结果如表5所示。表5 各台设备的比较过程及结果

经过上表的比较过程,此时以Device A为根桥的生成树就确定下来了,形状如图3所示。

图3 计算得到的生成树

说明:

为了便于描述,本例简化了生成树的计算过程,实际的过程要更加复杂。

(2) STP的配置消息传递机制

◆当网络初始化时,所有的设备都将自己作为根桥,生成以自己为根的配置消息,并以Hello Time为周期定时向外发送。

◆接收到配置消息的端口如果是根端口,且接收的配置消息比该端口的配置消息优,则设备将配置消息

中携带的Message Age按照一定的原则递增,并启动定时器为这条配置消息计时,同时将此配置消息从设备的指定端口转发出去。

◆如果指定端口收到的配置消息比本端口的配置消息优先级低时,会立刻发出自己的更好的配置消息进行回应。

◆如果某条路径发生故障,则这条路径上的根端口不会再收到新的配置消息,旧的配置消息将会因为超时而被丢弃,设备重新生成以自己为根的配置消息并向外发送,从而引发生成树的重新计算,得到一条新的通路替代发生故障的链路,恢复网络连通性。

不过,重新计算得到的新配置消息不会立刻就传遍整个网络,因此旧的根端口和指定端口由于没有发现网络拓扑变化,将仍按原来的路径继续转发数据。如果新选出的根端口和指定端口立刻就开始数据转发的话,可能会造成暂时性的环路。

(3) STP定时器

STP计算中,需要使用三个重要的时间参数:Forward Delay、Hello Time和Max Age。

◆ Forward Delay为设备状态迁移的延迟时间。链路故障会引发网络重新进行生成树的计算,生成树的结构将发生相应的变化。不过重新计算得到的新配置消息无法立刻传遍整个网络,如果新选出的根端口和指定端口立刻就开始数据转发的话,可能会造成暂时性的环路。为此,STP采用了一种状态迁移的机制,新选出的根端口和指定端口要经过2倍的Forward Delay延时后才能进入转发状态,这个延时保证了新的配置消息已经传遍整个网络。

◆ Hello Time用于设备检测链路是否存在故障。设备每隔Hello Time时间会向周围的设备发送hello 报文,以确认链路是否存在故障。

◆ Max Age是用来判断配置消息在设备内保存时间是否“过时”的参数,设备会将过时的配置消息丢弃。

◆ RSTP中,根端口的端口状态快速迁移的条件是:本设备上旧的根端口已经停止转发数据,而且上游指定端口已经开始转发数据。

◆ RSTP中,指定端口的端口状态快速迁移的条件是:指定端口是边缘端口或者指定端口与点对点链路相连。如果指定端口是边缘端口,则指定端口可以直接进入转发状态;如果指定端口连接着点对点链路,则设备可以通过与下游设备握手,得到响应后即刻进入转发状态。

数据结构课程设计图的遍历和生成树求解

数学与计算机学院 课程设计说明书 课程名称: 数据结构与算法课程设计 课程代码: 6014389 题目: 图的遍历和生成树求解实现 年级/专业/班: 学生姓名: 学号: 开始时间: 2012 年 12 月 09 日 完成时间: 2012 年 12 月 26 日 课程设计成绩: 指导教师签名:年月日

目录 摘要 (3) 引言 (4) 1 需求分析 (5) 1.1任务与分析 (5) 1.2测试数据 (5) 2 概要设计 (5) 2.1 ADT描述 (5) 2.2程序模块结构 (7) 软件结构设计: (7) 2.3各功能模块 (7) 3 详细设计 (8) 3.1结构体定义 (19) 3.2 初始化 (22) 3.3 插入操作(四号黑体) (22) 4 调试分析 (22) 5 用户使用说明 (23) 6 测试结果 (24) 结论 (26)

摘要 《数据结构》课程主要介绍最常用的数据结构,阐明各种数据结构内在的逻辑关系,讨论其在计算机中的存储表示,以及在其上进行各种运算时的实现算法,并对算法的效率进行简单的分析和讨论。进行数据结构课程设计要达到以下目的: ?了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力; ?初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能; ?提高综合运用所学的理论知识和方法独立分析和解决问题的能力; 训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。 这次课程设计我们主要是应用以前学习的数据结构与面向对象程序设计知识,结合起来才完成了这个程序。 因为图是一种较线形表和树更为复杂的数据结构。在线形表中,数据元素之间仅有线性关系,每个元素只有一个直接前驱和一个直接后继,并且在图形结构中,节点之间的关系可以是任意的,图中任意两个数据元素之间都可能相关。因此,本程序是采用邻接矩阵、邻接表、十字链表等多种结构存储来实现对图的存储。采用邻接矩阵即为数组表示法,邻接表和十字链表都是图的一种链式存储结构。对图的遍历分别采用了广度优先遍历和深度优先遍历。 关键词:计算机;图;算法。

最小生成树问题的算法实现及复杂度分析—天津大学计算机科学与技术学院(算法设计与分析)

算法设计与分析课程设计报告 学院计算机科学与技术 专业计算机科学与技术 年级2011 姓名XXX 学号 2013年5 月19 日

题目:最小生成树问题的算法实现及复杂度分析 摘要:该程序操作简单,具有一定的应用性。数据结构是计算机科学的算法理论基础和软件设计的技术基础,在计算机领域中有着举足轻重的作用,是计算机学科的核心课程。而最小生成树算法是算法设计与分析中的重要算法,最小生成树也是最短路径算法。最短路径的问题在现实生活中应用非常广泛,如邮递员送信、公路造价等问题。本设计以Visual Studio 2010作为开发平台,C/C++语言作为编程语言,以邻接矩阵作为存储结构,编程实现了最小生成树算法。构造最小生成树有很多算法,本文主要介绍了图的概念、图的遍历,并分析了PRIM 经典算法的算法思想,最后用这种经典算法实现了最小生成树的生成。 引言:假设要在n个城市之间建立通信联络网,则连接n个城市只需要n-1条线路。这时,自然会考虑这样一个问题,如何在节省费用的前提下建立这个通信网?自然在每两个城市之间都可以设置一条线路,而这相应的就要付出较高的经济代价。n个城市之间最多可以设置n(n-1)/2条线路,那么如何在这些可能的线路中选择n-1 条使总的代价最小呢?可以用连通网来表示n 个城市以及n个城市之间可能设置的通信线路,其中网的顶点表示城市,边表示两个城市之间的线路,赋予边的权值表示相应的代价。对于n个顶点的连通网可以建立许多不同的生成树,每一个生成树都可以是一个通信网。现在要选择这样一棵生成树,也就是使总的代价最小。这个问题便是构造连通网的最小代价生成树(简称最小生成树)的问题。最小生成树是指在所有生成树中,边上权值之和最小的生成树,另外最小生成树也可能是多个,他们之间的权值之和相等。一棵生成树的代价就是树上各边的代价之和。而实现这个运算的经典算法就是普利姆算法。

图习题及标准答案

图习题及标准答案

————————————————————————————————作者:————————————————————————————————日期:

第7章图 一、选择题 1.对于一个具有n个顶点和e条边的有向图,在用邻接表表示图时,拓扑排序算法时间复杂度为() A) O(n) B) O(n+e) C) O(n*n) D) O(n*n*n) 【答案】B 2.设无向图的顶点个数为n,则该图最多有()条边。 A)n-1 B)n(n-1)/2 C) n(n+1)/2 D)n2 【答案】B 3.连通分量指的是() A)无向图中的极小连通子图 B)无向图中的极大连通子图 C)有向图中的极小连通子图 D)有向图中的极大连通子图 【答案】B 4.n个结点的完全有向图含有边的数目() A)n*n B)n(n+1)C)n/2 D)n*(n-1) 【答案】D 5.关键路径是() A) AOE网中从源点到汇点的最长路径 B) AOE网中从源点到汇点的最短路径 C) AOV网中从源点到汇点的最长路径 D) AOV网中从源点到汇点的最短路径 【答案】A 6.有向图中一个顶点的度是该顶点的() A)入度 B)出度 C)入度与出度之和 D)(入度+出度)/2 【答案】C 7.有e条边的无向图,若用邻接表存储,表中有()边结点。 A) e B) 2e C) e-1 D) 2(e-1)

【答案】B 8.实现图的广度优先搜索算法需使用的辅助数据结构为() A)栈 B)队列 C)二叉树 D)树 【答案】B 9.实现图的非递归深度优先搜索算法需使用的辅助数据结构为() A)栈 B)队列 C)二叉树 D)树 【答案】A 10.存储无向图的邻接矩阵一定是一个() A)上三角矩阵 B)稀疏矩阵 C)对称矩阵 D)对角矩阵【答案】C 11.在一个有向图中所有顶点的入度之和等于出度之和的()倍 A) 1/2 B)1 C) 2 D) 4 【答案】B 12.在图采用邻接表存储时,求最小生成树的 Prim 算法的时间复杂度为()A) O(n) B) O(n+e) C) O(n2) D) O(n3) 【答案】B 13.下列关于AOE网的叙述中,不正确的是() A)关键活动不按期完成就会影响整个工程的完成时间 B)任何一个关键活动提前完成,那么整个工程将会提前完成 C)所有的关键活动提前完成,那么整个工程将会提前完成 D)某些关键活动提前完成,那么整个工程将会提前完成 【答案】B 14.具有10个顶点的无向图至少有多少条边才能保证连通() A) 9 B)10 C) 11 D) 12 【答案】A 15.在含n个顶点和e条边的无向图的邻接矩阵中,零元素的个数为()A) e B)2e C) n2-e D)n2-2e 【答案】D 16.对于一个具有n个顶点和e条边的无向图,如果采用邻接表来表示,则其表

数据结构课程设计-图的遍历和生成树的求解实现说明书

******************* 实践教学 ******************* 兰州理工大学 计算机与通信学院 2012年春季学期 算法与数据结构课程设计 题目:图的遍历和生成树的求解实现 专业班级:计算机科学与技术 姓名:*** 学号:1234567 指导教师:**** 成绩:

目录 摘要 (3) 前言 (4) 正文 (5) 1.问题描述: (5) 2.采用类C语言定义相关的数据类型 (5) 3.各模块流程图及伪码算法 (6) 4.函数的调用关系图 (8) 5.调试分析 (9) 1.调试中遇到的问题及对问题的解决方法 (9) 2.算法的时间复杂度和空间复杂度 (9) 6.测试结果 (10) 参考文献 (14)

图是一种复杂的非线性数据结构,一个图G(Grah)由两个集合V和E 构成,图存在两种遍历方式,深度优先遍历和广度优先遍历,广度优先遍历基本思路是假设从图中某顶点U出发,在访问了顶点U之后依次访问U的各个未访问的领接点,然后分别从这些领接点出发依次访问他们的领接点,并使先访问的顶点的领接点先于后访问的顶点被访问。直至所有领接点被访问到。深度优先的基本思路是从某个顶点出发,访问此顶点,然后依次从V的未被访问的领接点出发深度优先检索土。直至图中所有顶点都被访问到。PRIM算法—KRUSKAL算法;可以对图形进行最小生成树的求解。 主要问题是: (1)当给出一个表达式时,如何创建图所表达的树,即相应的逻辑结构和存储结构? (2)表达式建立好以后,如何求出其遍历?深度优先和广度优先遍历。 (3)计算它的最小生成树?主要是prim算法和kruscal算法两种形式。

分别利用prim算法和kruskal算法实现求图的最小生成树

/*分别利用prim算法和kruskal算法实现求图的最小生成树*/ #include #include #define MaxVertexNum 12 #define MaxEdgeNum 20 #define MaxValue 1000 typedef int Vertextype; typedef int adjmatrix[MaxVertexNum][MaxVertexNum]; typedef Vertextype vexlist[MaxVertexNum]; int visited[MaxVertexNum]={0}; struct edgeElem {int fromvex; int endvex; int weight; }; typedef struct edgeElem edgeset[MaxVertexNum]; void Creat_adjmatrix(vexlist GV,adjmatrix GA,int n,int e) {int i,j,k,w; printf("输入%d个顶点数据",n); for(i=0;i

if(i==j) GA[i][j]=0; else GA[i][j]=MaxValue; printf("输入%d条无向带权边",e); for(k=0;k

最小生成树算法分析

最小生成树算法分析 一、生成树的概念 若图是连通的无向图或强连通的有向图,则从其中任一个顶点出发调用一次bfs或dfs后便可以系统地访问图中所有顶点;若图是有根的有向图,则从根出发通过调用一次dfs或bfs亦可系统地访问所有顶点。在这种情况下,图中所有顶点加上遍历过程中经过的边所构成的子图称为原图的生成树。 对于不连通的无向图和不是强连通的有向图,若有根或者从根外的任意顶点出发,调用一次bfs或dfs后一般不能系统地访问所有顶点,而只能得到以出发点为根的连通分支(或强连通分支)的生成树。要访问其它顶点需要从没有访问过的顶点中找一个顶点作为起始点,再次调用bfs 或dfs,这样得到的是生成森林。 由此可以看出,一个图的生成树是不唯一的,不同的搜索方法可以得到不同的生成树,即使是同一种搜索方法,出发点不同亦可导致不同的生成树。 可以证明:具有n个顶点的带权连通图,其对应的生成树有n-1条边。 二、求图的最小生成树算法 严格来说,如果图G=(V,E)是一个连通的无向图,则把它的全部顶点V和一部分边E’构成一个子图G’,即G’=(V, E’),且边集E’能将图中所有顶点连通又不形成回路,则称子图G’是图G的一棵生成树。 对于加权连通图,生成树的权即为生成树中所有边上的权值总和,权值最小的生成树称为图的最小生成树。 求图的最小生成树具有很高的实际应用价值,比如下面的这个例题。

例1、城市公交网 [问题描述] 有一张城市地图,图中的顶点为城市,无向边代表两个城市间的连通关系,边上的权为在这两个城市之间修建高速公路的造价,研究后发现,这个地图有一个特点,即任一对城市都是连通的。现在的问题是,要修建若干高速公路把所有城市联系起来,问如何设计可使得工程的总造价最少。 [输入] n(城市数,1<=n<=100) e(边数) 以下e行,每行3个数i,j,w ij,表示在城市i,j之间修建高速公路的造价。 [输出] n-1行,每行为两个城市的序号,表明这两个城市间建一条高速公路。 [举例] 下面的图(A)表示一个5个城市的地图,图(B)、(C)是对图(A)分别进行深度优先遍历和广度优先遍历得到的一棵生成树,其权和分别为20和33,前者比后者好一些,但并不是最小生成树,最小生成树的权和为19。 [问题分析] 出发点:具有n个顶点的带权连通图,其对应的生成树有n-1条边。那么选哪n-1条边呢?设图G的度为n,G=(V,E),我们介绍两种基于贪心的算法,Prim算法和Kruskal算法。 1、用Prim算法求最小生成树的思想如下: ①设置一个顶点的集合S和一个边的集合TE,S和TE的初始状态均为空集; ②选定图中的一个顶点K,从K开始生成最小生成树,将K加入到集合S; ③重复下列操作,直到选取了n-1条边: 选取一条权值最小的边(X,Y),其中X∈S,not (Y∈S); 将顶点Y加入集合S,边(X,Y)加入集合TE; ④得到最小生成树T =(S,TE)

数据结构课程设计之图的遍历和生成树求解

##大学 数据结构课程设计报告题目:图的遍历和生成树求解 院(系):计算机工程学院 学生: 班级:学号: 起迄日期: 2011.6.20 指导教师:

2010—2011年度第 2 学期 一、需求分析 1.问题描述: 图的遍历和生成树求解实现 图是一种较线性表和树更为复杂的数据结构。在线性表中,数据元素之间仅有线性关系,每个数据元素只有一个直接前驱和一个直接后继;在树形结构中,数据元素之间有着明显的层次关系,并且每一层上的数据元素可能和下一层中多个元素(及其孩子结点)相关但只能和上一层中一个元素(即双亲结点)相关;而在图形结构中,节点之间的关系可以是任意的,图中任意两个数据元素之间都可能相关。 生成树求解主要利用普利姆和克雷斯特算法求解最小生成树,只有强连通图才有生成树。 2.基本功能 1) 先任意创建一个图; 2) 图的DFS,BFS的递归和非递归算法的实现 3) 最小生成树(两个算法)的实现,求连通分量的实现 4) 要求用邻接矩阵、邻接表等多种结构存储实现 3.输入输出

输入数据类型为整型和字符型,输出为整型和字符 二、概要设计 1.设计思路: a.图的邻接矩阵存储:根据所建无向图的结点数n,建立n*n的矩阵,其中元素全是无穷大(int_max),再将边的信息存到数组中。其中无权图的边用1表示,无边用0表示;有全图的边为权值表示,无边用∞表示。 b.图的邻接表存储:将信息通过邻接矩阵转换到邻接表中,即将邻接矩阵的每一行都转成链表的形式将有边的结点进行存储。 c.图的广度优先遍历:假设从图中的某个顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后再访问此邻接点的未被访问的邻接点,并使“先被访问的顶点的邻接点”先于“后被访问的顶点的邻接点”被访问,直至图中所有已被访问的顶点的邻接点都被访问到。若此时图中还有未被访问的,则另选未被访问的重复以上步骤,是一个非递归过程。 d.图的深度优先遍历:假设从图中某顶点v出发,依依次访问v的邻接顶点,然后再继续访问这个邻接点的系一个邻接点,如此重复,直至所有的点都被访问,这是个递归的过程。 e.图的连通分量:这是对一个非强连通图的遍历,从多个结点出发进行搜索,而每一次从一个新的起始点出发进行搜索过程中得到的顶点访问序列恰为其连通分量的顶点集。本程序利用的图的深度优先遍历算法。 2.数据结构设计: ADT Queue{ 数据对象:D={a i | a i ∈ElemSet,i=1,2,3……,n,n≥0} 数据关系:R1={| a i-1 ,a i ∈D,i=1,2,3,……,n} 基本操作: InitQueue(&Q) 操作结果:构造一个空队列Q。 QueueEmpty(Q) 初始条件:Q为非空队列。 操作结果:若Q为空队列,则返回真,否则为假。 EnQueue(&Q,e) 初始条件:Q为非空队列。 操作结果:插入元素e为Q的新的队尾元素。 DeQueue(&Q,e) 初始条件:Q为非空队列。 操作结果:删除Q的队头元素,并用e返回其值。}ADT Queue

,图的遍历及最小生成树实验报告

实验三最小生成树问题 班级:计科1101班 学号:0909101605 姓名:杜茂鹏 2013年5月23日

一、实验目的 掌握图的存储表示和以及图的最小生成树算法。 二、实验内容 1.实现图的存储,并且读入图的内容。 2.利用普里姆算法求网络的最小生成树。 3.实现构造生成树过程中的连通分量抽象数据类型。 4.以文本形式输出对应图的最小生成树各条边及权值。 三、实验要求 1.在上机前写出全部源程序; 2.能在机器上正确运行程序; 3.用户界面友好。 四、概要设计、 首先采用图的邻接矩阵存储结构,然后从终端输入图的顶点名称、弧以及弧的权值建立邻接矩阵,并将图存储在文件Graph.txt中。 然后利用已经建好的图,分别对其进行深度、广度优先遍历,一次输出遍历的顶点 最后建立此图的最小生成树,并将对应的边及权值写入文件graph_prim.txt 中。 六、详细设计 实验内容(原理、操作步骤、程序代码) #include #include #include #define INFINITY INT_MAX //最大值 #define MAX_VERTEX_NUM 20 //最大顶点个数 int visited[MAX_VERTEX_NUM]; typedef struct ArcCell{ int adj; int *info; //该弧相关信息的指针 }ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; typedef struct close { char adjvex; int lowcost; }closedge[MAX_VERTEX_NUM];

求出下图的最小生成树

求出下图的最小生成树 解:MATLAB程序: % 求图的最小生成树的prim算法。 % result的第一、二、三行分别表示生成树边的起点、终点、权集合 % p——记录生成树的的顶点,tb=V\p clc;clear; % a(1,2)=50; a(1,3)=60; % a(2,4)=65; a(2,5)=40; % a(3,4)=52;a(3,7)=45; % a(4,5)=50; a(4,6)=30;a(4,7)=42; % a(5,6)=70; % a=[a;zeros(2,7)]; e=[1 2 20;1 4 7;2 3 18;2 13 8;3 5 14;3 14 14;4 7 10;5 6 30;5 9 25;5 10 9;6 10 30;6 11 30;7 8 2;7 13 5;8 9 4;8 14 2;9 10 6;9 14 3;10 11 11;11 12 30]; n=max([e(:,1);e(:,2)]); % 顶点数 m=size(e,1); % 边数 M=sum(e(:,3)); % 代表无穷大 a=zeros(n,n); for k=1:m a(e(k,1),e(k,2))=e(k,3); end a=a+a';

a(find(a==0))=M; % 形成图的邻接矩阵 result=[];p=1; % 设置生成树的起始顶点 tb=2:length(a); % 设置生成树以外顶点 while length(result)~=length(a)-1 % 边数不足顶点数-1 temp=a(p,tb);temp=temp(:); % 取出与p关联的所有边 d=min(temp); % 取上述边中的最小边 [jb,kb]=find(a(p,tb)==d); % 寻找最小边的两个端点(可能不止一个) j=p(jb(1));k=tb(kb(1)); % 确定最小边的两个端点 result=[result,[j;k;d]]; % 记录最小生成树的新边 p=[p,k]; % 扩展生成树的顶点 tb(find(tb==k))=[]; % 缩减生成树以外顶点 end result % 显示生成树(点、点、边长) weight=sum(result(3,:)) % 计算生成树的权 程序结果: result = 1 4 7 8 14 7 9 13 10 10 14 10 11 4 7 8 14 9 13 10 2 5 11 3 6 12 7 10 2 2 3 5 6 8 9 11 1 4 30 30 weight = 137 附图 最小生成树的权是137

离散数学--最小生成树实验报告

一、实验目的:掌握图的存储表示和以及图的最小生成树算法。 二、实验内容: 1.实现图的存储,并且读入图的内容。 2.利用克鲁斯卡尔算法求网络的最小生成树。 3.实现构造生成树过程中的连通分量抽象数据类型。 4.以文本形式输出对应图的最小生成树各条边及权值。 三、实验要求: 1.在上机前写出全部源程序; 2.能在机器上正确运行程序; 3.用户界面友好。 需求分析: 1、利用克鲁斯卡尔算法求网的最小生成树; 2、以用户指定的结点为起点,分别输出每种遍历下的结点访问序列; 3、输入为存在边的顶点对,以及它们之间的权值;输出为所得到的邻接矩 阵以及按权排序后的边和最后得到的最小生成树; 克鲁斯卡尔算法:假设WN=(V,{E}) 是一个含有n 个顶点的连通网,按照构造最小生成树的过程为:先构造一个只含n 个顶点,而边集为空的子图,之后,从网的边集 E 中选取一条权值最小的边,若该条边的两个顶点分属不同的树,则将其加入子图,反之,若该条边的两个顶点已落在同一棵树上,则不可取,而应该取下一条权值最小的边再试之。依次类推,直至只有一棵树,也即子图中含有n-1条边为止。 测试数据: 自行指定图进行运算

四、详细设计 源程序 #include #include #define M 20 #define MAX 20 typedef struct { int begin; int end; int weight; }edge; typedef struct { int adj; int weight; }AdjMatrix[MAX][MAX]; typedef struct { AdjMatrix arc; int vexnum, arcnum; }MGraph; void CreatGraph(MGraph *); void sort(edge* ,MGraph *); void MiniSpanTree(MGraph *); int Find(int *, int ); void Swapn(edge *, int, int); void CreatGraph(MGraph *G) {

生成树的计数及其应用

生成树的计数及其应用 目录 生成树的计数及其应用 (1) 目录 (1) 摘要 (2) 关键字 (2) 问题的提出 (2) [例一]高速公路(SPOJ p104 Highways) (2) [分析] (2) 预备知识 (2) 排列 (3) 行列式 (4) 新的方法 (7) 介绍 (7) 证明 (9) 理解 (12) 具体应用 (12) [例二]员工组织(UVA p10766 Organising the Organisation) (13) [分析] (13) [例三]国王的烦恼(原创) (13) [分析] (14) 总结 (14) 参考文献 (14)

摘要 有关生成树的最优化问题如最小生成树等是我们经常遇到的,而对生成树的计数及其相关问题则少有涉及。事实上,生成树的计数是十分有意义的,在许多方面都有着广泛的应用。首先介绍了一种指数级的动态规划算法,然后介绍了行列式的基本概念、性质,并在此基础上引入Matrix-Tree定理,同时通过与一道数学问题的对比,揭示了该定理所包含的数学思想。最后通过几道例题介绍了生成树的计数的应用,并进行总结。 关键字 生成树的计数Matrix-Tree定理 问题的提出 [例一]高速公路(SPOJ p104 Highways) 一个有n座城市的组成国家,城市1至n编号,其中一些城市之间可以修建高速公路。现在,需要有选择的修建一些高速公路,从而组成一个交通网络。你的任务是计算有多少种方案,使得任意两座城市之间恰好只有一条路径? 数据规模:1≤n≤12。 [分析] 我们可以将问题转化到成图论模型。因为任意两点之间恰好只有一条路径,所以我们知道最后得到的是原图的一颗生成树。因此,我们的问题就变成了,给定一个无向图G,求它生成树的个数t(G)。这应该怎么做呢? 经过分析,我们可以得到一个时间复杂度为O(3n*n2)的动态规划算法,因为原题的规模较小,可以满足要求。但是,当n再大一些就不行了,有没有更优秀的算法呢?答案是肯定的。在介绍算法之前,首先让我们来学习一些基本的预备知识。 预备知识 下面,我们介绍一种重要的代数工具——行列式。为了定义行列式,我们首先来看一下排列的概念。

图的遍历与最小生成树

图论1——图的遍历与图的最小生成树一、图的遍历 图的遍历:从图的某顶点出发,访问图中所有顶点,并且每个顶点仅访问一次。在图中,访问部分顶点后,可能又沿着其他边回到已被访问过的顶点。为保证每一个顶点只被访问一次,必须对顶点进行标记,一般用一个辅助数组visit[n]作为对顶点的标记,当顶点vi未被访问,visit[i]值为0;当vi已被访问,则visit[i]值为1。 有两种遍历方法(它们对无向图,有向图都适用) 深度优先遍历 广度优先遍历 1、深度优先遍历 从图中某顶点v出发: 1)访问顶点v; 2)依次从v的未被访问的邻接点出发,继续对图进行深度优先遍历; 对于给定的图G=(V,E),首先将V中每一个顶点都标记为未被访问,然后,选取一个源点v V,将v标记为已被访问,再递归地用深度优先搜索方法,依次搜索v的所有邻接点w。若w未曾访问过,则以w为新的出发点继续进行深度优先遍历,如果从v出发有路的顶点都已被访问过,则从v的搜索过程结束。此时,如果图中还有未被访问过的顶点(该图有多个连通分量或强连通分量),则再任选一个未被访问过的顶点,并从这个顶点开始做新的搜索。上述过程一直进行到V中所有顶点都已被访问过为止。 例:在下图中,从V0开始进行一次深度遍历的过程如图所示: 深度优先遍历得到的遍历序列为:

序列1:V0,V1,V3,V7,V4,V2,V5,V6 序列2:V0,V1,V4,V7,V3,V2,V5,V6 由于没有规定访问邻接点的顺序,深度优先序列不是唯一的。 但是,当采用邻接表存储结构并且存储结构已确定的情况下,遍历的结果将是确定的。例如:对下图(a)的邻接表存储(图b)的遍历过程如图(c)。 图a 图b 图c DFS序列:c0 → c1→ c3→ c4→ c5→ c2 采用邻接表存储结构的深度优先遍历算法实现: Pascal语言: procedure dfs(g:adjgraph;i:integer); var p:edgenode; begin writeln('visit vertex:',g.adjlist[i]^.vertex); visited[i]:=true; p:=g.adjlist[i]^.firstedge; while p<>nil do begin if not visited[p^.adjvex]then dfs(g,p^.adjvex); p:=p^.next; end;

求无向连通图的生成树

求无向连通图的生成树

————————————————————————————————作者:————————————————————————————————日期:

求无向连通图的生成树 一、实验目的 ⑴掌握图的逻辑结构 ⑵掌握图的邻接矩阵存储结构 ⑶验证图的邻接矩阵存储及其遍历操作的实现 二、实验内容 (1)建立无向图的邻接矩阵存储 (2)对建立的无向图,进行深度优先遍历 (3)对建立的无向图进行广度优先遍历 三、设计与编码 (1)本实验用到的理论知识 (2)算法设计 (3)编码 // 图抽象类型及其实现.cpp : Defines the entry point for the console application. // #include"stdafx.h" #include"Graph.h" #include"iostream.h" int Graph::Find(int key,int &k) { ?int flag=0; ?for(int i=0;i<VertexLen;i++) ?if(A[i].data.key==key){k=i;flag=1;break;}; return flag; }; int Graph::CreateGraph(int vertexnum,Edge *E,int edgenum) {//由边的集合E(E[0]~E[VertexNum-1]),生成该图的邻接表

表示 if(vertexnum<1)return(-1);//参数vertexnum非法int i,front,rear,k; ?Enode *q; ?//先生成不带边表的顶点表--即顶点为孤立顶点集 ?A=newVnode[vertexnum]; if(!A)return(0);//堆耗尽 ?for(i=0;ikey=front; q->Weight=E[i].weight; ??q->next=A[rear].first; ?A[rear].first=q; ?A[rear].data.OutDegree++; A[front].data.InDegree++; ?if(Type>2) { ??q=new Enode;

14-L.03 图的关联矩阵及生成树数目

离散数学基础 ?单元内容提示 ?图的关联矩阵?比内‐柯西定理?图的生成树的数目 ?定义. 有向图的关联矩阵 ?对有向图 G=(V, A),n =|V|,设 V={v 1, v 2, …, v n },A={a 1, a 2, …, a m },构造矩阵B=( b ij )n ×m ,其中 称 B 是图 G 的关联矩阵。 ?例. ?关联矩阵的特征 ?每列有两个非零元 +1、‐1;?孤立点对应的行是0向量; ?非连通图的结点和弧经适当排列,可得到对角分块的关联矩阵。 1234567123456 7 1110000100101001011000010110000000100000010000000?? ?????? ????? ???????? ????????v v v v v v v a a a a a a a 2017-11-19

1000000k P P ? ??? ?? ? ?? ?% ? 定理1. ? 有向图 G =(V, A) 的关联矩阵 B 的秩 r(B)<|V|。 ? 证明:B 的 |V| 个行向量之和为0,故 r(B)<|V| 。 ? 定理2. ? 有向图 G=(V, A) 的关联矩阵 B 中任一子式的值为 0、+1 或 ‐1。 ? 证明:设 S k 为 B 中任一 k 阶方阵,k ≤ min (|V|, |A|) 。 初始化 i =k 。 ① 若 S i 中任一列都含有+1和 ‐1,则 S i 不满秩, det(S i )=0, 计算结束,此时 det(S k ) =0; ② 否则, det(S i ) 中有某一列只含一个+1或‐1,按此列作行列式展开,得到一个降一阶子式 det(S i ‐1),且det(S i ) = det(S i ‐1) 或 det(S i ) = ‐det(S i ‐1); ③ 令 i =i ‐1,若 i >2 转 ① ;否则计算结束,此时 det(S k ) = det(S 2) 或 det(S k ) = ‐det(S 2),易知 S 2 的值只能为0、+1或‐1。 ? 定理2’. ? 有向连通图 G=(V,A) 的关联矩阵 B 的秩 r(B)=n ‐1,n =|V|。 ? 证明:先证明 r(B) ≥ n ‐1。反证:若 r(B)

最小生成树问题,图形输出最小生成树

数据结构课程设计 系别电子信息系 专业计算机科学与技术 班级学号 姓名 指导教师 成绩 2012年7 月12日

目录 1 需求分析 (2) 2 概要设计 (2) 2. 1抽象数据类型定义 (2) 2 . 2模块划分 (3) 3 详细设计 (4) 3. 1数据类型的定义 (4) 3. 2主要模块的算法描述 (6) 4 调试分析 (10) 5 用户手册 (10) 6 测试结果 (11) 7 附录(源程序清单) (13) 参考文献 (20)

一、需求分析 1.要在n个城市之间建设通信网络,只需要架设n-1条线路即可,而要以最低的经济代价建设这个通信网,就需要在这个网中求最小生成树。 (1)利用克鲁斯卡尔算法求网的最小生成树。 (2)实现教科书 6.5 节中定义的抽象数据类型 MFSet 。以此表示构造生成树过程中的连通分量。 (3)输入顶点个数,输入顶点序号(用整型数据[0,1,2,……,100]表示),输入定点之间的边的权值(整型数据)。系统构造无向图,并求解最小生成树。 (4)以图形和文本两种形式输出最小生成树。 2.程序执行的命令包括: (1)随机生成一个图; (2)输入图坐标信息; (3)以文本形式输出最小生成树; (4)以图形形式输出最小生成树; (5)以图形形式输出构造的图; (6)结束。 3.测试数据 (1)用户输入需要构造的图形顶点个数,假设顶点个数为4; (2)C语言函数随机生成的图形,顶点分别为a,b,c,d,权值分别为: ab=75,ac=99,ad=80,bc=33,bd=93,cd=19; (3)最小生成树边的权值分别为:ab=75,bc=33,cd=19; (4)结束。 二、概要设计 1. 图的抽象数据类型定义 ADT Gragh{ 数据对象V:V是具有相同特性的数据元素的集合,称为顶点集。 数据关系R: R={VR} VR={| v,w∈V且P(v,w),表示从v到w的弧, 谓词P(v,w)定义了弧的意义或信息 } 基本操作P: CreateGraph(&G,V,VR); 初始条件:V是图的顶点集,VR是图中弧的集合。 操作结果:按V和VR的定义构造图G。 DestroyGragh(&G); 初始条件:图G存在。 操作结果:销毁图G。 GetVex(G,v); 初始条件:图G存在,v是G中某个顶点。 操作结果:返回v的值。 FirstAdjvex(G,v); 初始条件:图G存在,v是G中某个顶点。

求无向连通图的生成树

求无向连通图的生成树 一、实验目的 ⑴掌握图的逻辑结构 ⑵掌握图的邻接矩阵存储结构 ⑶验证图的邻接矩阵存储及其遍历操作的实现 二、实验内容 (1)建立无向图的邻接矩阵存储 (2)对建立的无向图,进行深度优先遍历 (3)对建立的无向图进行广度优先遍历 三、设计与编码 (1)本实验用到的理论知识 (2)算法设计 (3)编码 // 图抽象类型及其实现.cpp : Defines the entry point for the console application. // #include"stdafx.h" #include"Graph.h" #include"iostream.h" int Graph::Find(int key,int &k) { int flag=0; for(int i=0;i

if(vertexnum<1)return(-1);//参数vertexnum非法 int i,front,rear,k; Enode *q; //先生成不带边表的顶点表--即顶点为孤立顶点集 A=new Vnode[vertexnum]; if(!A)return(0);//堆耗尽 for(i=0;ikey=front; q->Weight=E[i].weight; q->next=A[rear].first; A[rear].first=q; A[rear].data.OutDegree++; A[front].data.InDegree++; if(Type>2) { q=new Enode; if(!q)return(0); q->key=rear; q->next=A[front].first;

1040 【图论基础】求连通子图的个数 1041 【图论基础】求最小生成树(prim)

【图论基础】求连通子图的个数 Time Limit:10000MS Memory Limit:65536K Total Submit:42 Accepted:30 Description 求一个无向图中连通子图的个数。 Input 第一行一个数n,表示无向图的顶点的数量(n<=5000),接下来从第2行到第n+1行,每行有n个数(1表示相应点有直接通路,0表示无直接通路),形成一个n*n的矩阵,用以表示这个无向图。示例: Output 输出一个数,表示这个图含有连通子图的个数。 Sample Input 5 1 0 1 0 0 0 1 1 1 0 1 1 1 1 0 0 1 1 1 0 0 0 0 0 1 Sample Output 自己算吧! Source

?var ? i,j,n,ans,x:longint; ? a:array[1..5000,0..5000] of longint; ? b:array[1..5000] of boolean; ?procedure dfs(x:longint); ?var i:longint; ?begin ? b[x]:=false; ? for i:=1 to a[x,0] do if b[a[x,i]] then ? dfs(a[x,i]); ?end; ? ?begin ? readln(n); ? for i:=1 to n do ? for j:=1 to n do begin ? read(x); ? if x=1 then begin ? inc(a[i,0]); a[i,a[i,0]]:=j; ? end; ? end; ? fillchar(b,sizeof(b),true); ? for i:=1 to n do if b[i] then begin ? inc(ans); ? dfs(i); ? end; ? writeln(ans); ?end.

相关主题