搜档网
当前位置:搜档网 › 图的连通性及最小生成树

图的连通性及最小生成树

无向图的深度优先生成树

用邻接表存储的无向图的深度优先生成树,树结点用孩子兄弟结构保存。下面是代码view plain 1.#include 2.#include https://www.sodocs.net/doc/1314349380.html,ing namespace std; 4. 5.#define MAX_VERTEX_NUM 20 6.bool visited[20];//用于遍历时辅助使用 7.bool searched[20];//用于建树时辅助使用 8. 9.//循环队列模版 10.template 11.class My_queue; 12. 13.template 14.class Node 15.{ 16.private: 17. T data; 18. Node *next; 19.public: 20. Node() 21. { 22. next=0; 23. } 24. Node(T d) 25. { 26. data=d; 27. next=0; 28. } 29.friend My_queue; 30.}; 31. 32.template 33.class My_queue 34.{ 35.private: 36. Node *tail; 37.public: 38. My_queue() 39. { 40. tail=new Node();

41. tail->next=tail; 42. } 43. 44.bool empty() 45. { 46.return (tail->next==tail); 47. } 48. 49.void push(T d) 50. { 51. Node *p=new Node(d); 52. p->next=tail->next; 53. tail->next=p; 54. tail=p; 55. } 56. 57. T front() 58. { 59.if(empty()) 60. { 61. cout<<"queue is empty!"< *p=tail->next; 65. T data=p->next->data; 66.return data; 67. } 68. 69.void pop() 70. { 71. Node *p=tail->next; 72. Node *q=p->next; 73. p->next=q->next; 74.if(q==tail) 75. tail=p; 76.delete q; 77. } 78.}; 79. 80.class ALGraph; 81.class CS_Tree; 82.//树结点 83.class CSnode 84.{

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

数学与计算机学院 课程设计说明书 课程名称: 数据结构与算法课程设计 课程代码: 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)

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

实习三--求无向连通图的生成树

实习三求无向连通图的生成树 1?需求分析 问题描述: 若要在n个城市之间建设通信网络,只需要架设n-1条路线即可。如何以最低的经济代价建设这个通信网,是一个网的最小生成树问题。 基本要求: (1) 利用克鲁斯卡尔算法求网的最小生成树,其中,以课本8.7节中的等 价类表示构造生成树过程中的连通分量。 (2) 利用普里姆算法求网的最小生成树。 (3) 以文本文件形式输出生成树中各条边以及他们的权值。 2.设计 (1) 设计思想:创建邻接矩阵存储结构。本程序主要分为两个模块:创建邻接矩阵模块,最小生成树模块。创建邻接矩阵模块:以邻接矩阵的存储形式创建无向网。最小生成树模块:生成最小生成树,输出其各条边及权值。 (2) 概要设计:int型LocateVex函数判断权值在矩阵的位置;声明CraeteGraph 函数创建邻接矩阵;声明kruskal函数用于生成最小生成树;声明main函数为程序调用步骤。 (3) 设计详细:a.将程序分为两个模块: B. 主函数流程图:

C. 最小生成树流程图 (4) 调试分析:--变量没定义就使用 --子函数嵌套定义; --使用数组是越界; (5) 用户手册:a.主页面: 解决:定义完变量在使用。 解决:子函数单独定义,可调用。 解决:注意数组的值,注意不能越界 b.输入顶点数及边数的信息:

d.输入顶点及权值 c.输入顶点信息 (6)测试结果:输出最小生成树及 权值 #i nclude #i nclude #i nclude #defi ne MAX 100 #defi ne MAX_VERTEXNUM 20 typedef char Vertex[MAX];〃 顶点字符串 typedef int Adjmatrix[MAX_VERTEXNUM][MAX_VERTEXNUM];〃 邻接矩阵 typedef struct//定义图 〔用空格隔 卷迎建设通 请输入顶蕉 譎入m 个顶点的信息* :青紹3条边的两个顶点及权値;〔用空格隔开) 欢迎建 i 珮入 请输入彳个顶点的信息; 論条迪的两个顶点及权值;(用空格隔开) 嚴费矗数颓边数’(用空槨研) 歸 个顶点的信息:(压空格隔开) 最小生成树的各条边及权值 为 1-2-1 飯黑边数:(用空格隔 开) (用空格隔开) 長和边数:(用空格隔开) (用空格隔开) 嬲边数

分别利用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)

求出下图的最小生成树

求出下图的最小生成树 解: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

7.4.1无向图的连通分量和生成树

7.4.1无向图的连通分量和生成树。

void DFSForest(Graph G,CSTree &T) //建立无向图G的深度优先生成森林的 //(最左)孩子(右)兄弟链表T。 { T=NULL; for(v=0;vnextSibling=p; //是其他生成树的根(前一棵的根的“兄弟”)。 q=p; //q指示当前生成树的根。 DFSTree(G,v,p); //建立以p为根的生成树。 }// if(!visited[v]) }// for(v=0;vlchild=p;first=FALSE; }// if(first) else //w是v的其它未被访问的邻接顶点 { //是上一邻接顶点的右兄弟节点。 q->nextsibling=p; }// else q=p; DFSTree(G,w,q); //从第w个顶点出发深度优先遍历图G,建立子生成树q。 }// if(!visited[w]) }// for(w=FirstAdjVex(G,v); }// DFSTree

求无向连通图的生成树

求无向连通图的生成树

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

求无向连通图的生成树 一、实验目的 ⑴掌握图的逻辑结构 ⑵掌握图的邻接矩阵存储结构 ⑶验证图的邻接矩阵存储及其遍历操作的实现 二、实验内容 (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;

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

一、实验目的:掌握图的存储表示和以及图的最小生成树算法。 二、实验内容: 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)建立无向图得邻接矩阵存储 (2)对建立得无向图,进行深度优先遍历 (3)对建立得无向图进行广度优先遍历 三、设计与编码 (1)本实验用到得理论知识 (2)算法设计 (3)编码 // 图抽象类型及其实现、cpp : Defines the entry point for the console application、 // #include”stdafx。h” #include”Graph.h" #include”iostream。h” intGraph::Find(int key,int&k) { int flag=0; for(inti=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 edge num) {?//由边得集合E(E[0]~E[VertexNum—1]),生成该图得邻接表表示?if(vertexnum<1)return(—1);//参数vertexnum非法 ?int i,front,rear,k;

Enode *q; //先生成不带边表得顶点表-—即顶点为孤立顶点集 A=new Vnode[vertexnum]; ?if(!A)return(0);//堆耗尽 for(i=0;i〈vertexnum;i++) { ?A[i]、data、key=i; ?A[i]、tag=0; ??A[i]、data.InDegree=A[i]、data。OutDegree=A[i]、tag=0; ?A[i]、first=0; }; VertexLen=vertexnum; //在生成边表 ?if(edgenum〈0)return(1);//无边得图 for(i=0;i<edgenum;i++) { ? front=E[i]。Head;rear=E[i]。Tail; ?if(!Find(rear,k) ||!Find(front,k))return(-2);//参数E非法 ?q=new Enode; ?if(!q)return(0); ??q->key=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; ??A[front]。first=q;

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

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

一、实验目的 掌握图的存储表示和以及图的最小生成树算法。 二、实验内容 1.实现图的存储,并且读入图的内容。 2.利用普里姆算法求网络的最小生成树。 3.实现构造生成树过程中的连通分量抽象数据类型。 4.以文本形式输出对应图的最小生成树各条边及权值。 三、实验要求 1.在上机前写出全部源程序; 2.能在机器上正确运行程序; 3.用户界面友好。 四、概要设计、 首先采用图的邻接矩阵存储结构,然后从终端输入图的顶点名称、弧以及弧的权值建立邻接矩阵,并将图存储在文件中。 然后利用已经建好的图,分别对其进行深度、广度优先遍历,一次输出遍历的顶点 最后建立此图的最小生成树,并将对应的边及权值写入文件中。 六、详细设计 实验内容(原理、操作步骤、程序代码) #include<> #include<> #include<> #define INFINITY INT_MAX owcost!=0&&mini>cld[i].lowcost) { mini=cld[i].lowcost; s1=i; } } return s1; } void CreateUDN(MGraph &G) { int IncInfo; printf("请分别输入顶点数/弧数/以及弧所含信息:"); scanf("%d %d %d",&,&,&IncInfo);

getchar(); for(int i=0;i<;i++){ dj=INFINITY; [i][j].info=NULL; } for(int k=0;k<;k++) { char v1,v2; int w,i,j; printf("输入一条边依附的顶点及权值:"); dj=w; if(IncInfo) *[i][j].info=IncInfo; [j][i]=[i][j]; getchar(); } } dj!=INFINITY) DFS(G,j); } void BFSTraverse(MGraph G,void(*Visit)(MGraph G,int v)) { LinkQueue Q; for(int v=0;v<;v++) visited[v]=0; InitQueue(Q); for(int v=0;v<;v++) if(!visited[v]) { visited[v]=1; Visit(G,v); EnQueue(Q,[v]); while(!QueueEmpty(Q)) { DeQueue(Q); for(int j=0;j<;j++) if(!visited[j]&&[v][j].adj!=INFINITY) { visited[j]=1; Visit(G,j); EnQueue(Q,[j]); } } } } void MiniSpanTree_PRIM(MGraph G,char u)

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

图的遍历和生成树求解实现的课程结构设计 一.问题描述: 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.图的连通分量:这是对一个非强连通图的遍历,从多个结点出发进行搜索,而每一次从一个新的起始点出发进行搜索过程中得到的顶点访问序列恰为其连通分量的顶点集。本程序利用的图的深度优先遍历算法。

求无向连通图的生成树

求无向连通图的生成树 一、实验目的 ⑴掌握图的逻辑结构 ⑵掌握图的邻接矩阵存储结构 ⑶验证图的邻接矩阵存储及其遍历操作的实现 二、实验内容 (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;

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

数据结构课程设计 系别电子信息系 专业计算机科学与技术 班级学号 姓名 指导教师 成绩 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中某个顶点。

图的最小生成树的实现

数据结构课程设计 设计说明书 图的最小生成树的实现(Kruskal算法) (Kruskal算法)

计算机科学与技术系 2011 年 3 月 4 日 数据结构课程设计评阅书

指导教师(签字):教研室主任(签字):批准日期:年月日

图的最小生成树的实现(Kruskal算法)是一种按照网中边的权值递增的顺序构造最小生成树的方法.在构造过程中,按照网中边的权值由小到大的顺序,不断选取当前当前为被选取的边集中权值最小的边.最后形成的连通分量便是最小生成树.在存储图时选取邻接矩表.此算法的关键问题是如何判断回路,解决办法是定义一个一维数组,让f[i]=I,在增加边时判断f[i]是否和f[j]相同.这样的设计更方便实用,可以使用户更好的使用. 关键词:邻接矩阵;邻接表;kruskal;最小生成树

1 课题描述 (1) 2问题分析和任务定义 (2) 3 逻辑设计 (3) 4 程序编码 (5) 6 总结 (10) 参考文献 (11)

1 课题描述 图的最小生成树的定义:设图连通G的所有边的集合E(G),在从任意顶点出发便利图时,必定将E(G)分为两部分,一个是便利的边的集合,另一个是剩余的.把经历的边的集合和图G中所有顶点一起构成连通图G的极小连通子图。这个连通图是一棵生成树,无向连通图的生成树不是唯一的,连通图的一次遍历所经历的边的集合及图中所有顶点的集合就构成了该图的一棵生成树,对连通图的不同遍历,就可得到不同的生成树。如果无相连通图是一个网,那么它所有生成树中必有一棵边的权值总和最小的生成树,我们称这棵树是最小生成树。本次课设将采用Kruskal算法解决最小生成树问题。 1

实习三--求无向连通图的生成树

实习三求无向连通图的生成树 1.需求分析 问题描述: 若要在n个城市之间建设通信网络,只需要架设n-1条路线即可。如何以最低的经济代价建设这个通信网,是一个网的最小生成树问题。 基本要求: (1)利用克鲁斯卡尔算法求网的最小生成树,其中,以课本8.7节中的等 价类表示构造生成树过程中的连通分量。 (2)利用普里姆算法求网的最小生成树。 (3)以文本文件形式输出生成树中各条边以及他们的权值。 2.设计 (1)设计思想:创建邻接矩阵存储结构。本程序主要分为两个模块:创建邻接矩阵模块,最小生成树模块。创建邻接矩阵模块:以邻接矩阵的存储形式创建无向网。最小生成树模块:生成最小生成树,输出其各条边及权值。 (2)概要设计:int型LocateVex函数判断权值在矩阵的位置;声明CraeteGraph 函数创建邻接矩阵;声明kruskal函数用于生成最小生成树;声明main函数为程序调用步骤。 (3)设计详细:a.将程序分为两个模块: B.主函数流程图:

c.最小生成树流程图 (4)调试分析:--变量没定义就使用解决:定义完变量在使用。 --子函数嵌套定义;解决:子函数单独定义,可调用。 --使用数组是越界;解决:注意数组的值,注意不能越界。 (5)用户手册:a.主页面: b.输入顶点数及边数的信息:

c.输入顶点信息: d.输入顶点及权值: (6)测试结果:输出最小生成树及权值: (7)源程序: #include #include #include #define MAX 100 #define MAX_VERTEXNUM 20 typedef char Vertex[MAX];//顶点字符串 typedef int Adjmatrix[MAX_VERTEXNUM][MAX_VERTEXNUM];//邻接矩阵typedef struct//定义图

图的遍历生成树

实验项目:图的先深、先广遍历生成树 实验目的: 1、学会把图转化为程序能识别的邻接矩阵 2、透彻理解图的两种遍历方法及对应的生成树。 涉及的知识点:图的表示法、生成树的概念、图的深度优先、广度优先遍历算法 实验内容: 该程序是对树进行先深、先广遍历,请在此基础上,改为处理指定图,求该图从指定结点出发的先深、先广遍历生成树。 // AdjMWGraph.h : Defines the entry point for the console application. #include "SeqList.h" #include "SeqQueue.h" const int MaxVertices=10; const int Max Weight=10000; //表示无穷大 class AdjMWGraph { private: SeqList Vertices; // 顶点信息的线性表 int Edge[MaxVertices][MaxVertices]; //边的权信息矩阵 int numOf E dges; //当前的边数 public: AdjMWGraph(const int sz=MaxVertices);//构造函数,参数是顶点数目 int GraphEmpty()const { return Vertices.ListEmpty(); } int NumOfVertices(void)//当前结点个数 { return Vertices.ListSize(); } int NumOf E dges(void)//边数 { return numOf E dges; } VerT GetValue(const int i); //取结点i的值 int GetWeight(const int v1, const int v2); //取弧的权重; //插入顶点vertex void InsertVertex(const VerT &vertex); //插入弧,权为w eight void InsertE dge(const int v1,const int v2,int w eight); //删除与顶点i及关联的边 void DeleteVertex(const int i); //删除弧 void DeleteEdge(const int v1,const int v2); //取顶点i的第一条邻接边,返回邻接点的下标,否则返回-1 int GetFirstNeighbor(const int v);

相关主题