最小生成树-实验报告
北航数据结构
检查所有一个端点在集合 U 里而另一个端点在集合 V-U 的边,找出其中权最小的边 e=(u,v) (假设 u 在 U 中,v 在 V-U 中),将顶点 v 加入顶点集合 U,并将 e 加入边集合 Er。易见, 扩充之后的 T=(U,Er)仍是一棵树。 重复上面步骤直到 U=V(所构造的树已经包含了所有顶点)。这时集合 Er 里有 n-1 条边, 子图 T=(U,Er)就是 G 的一棵最小生成树。 Dijkstra 算法 初始:
p=end l=0 while p>=1 and l<nodes:
road[l]=p p=nodepre[p] l+=1 l-=1 while l>=0: roads.append(road[l]) l-=1 return dis[end],roads def map():
map=[[inf,inf,inf,inf,inf,inf],[inf,inf,inf,6,3,inf,inf,inf],[inf,11, inf,4,inf,inf,7,inf],
if __name__=='__main__': map()
四、结果
Dijkstra
代码 1: class Graph():
def __init__(self,map): self.map=map self.nodenumber=self.nodenumber()
最小生成树 实验报告
最小生成树(Minimum Spanning Tree)实验报告
1. 实验目的
本实验旨在通过实践掌握最小生成树算法的基本原理和实现方法。最小生成树是图论中的一个重要概念,用于解决具有权重的连通图的最优路径问题。通过本实验,我们将学习如何使用最小生成树算法找到一棵连接图的所有节点且总权重最小的树。
2. 实验原理
最小生成树是一个连通图的一种生成树,它的所有边的权重之和最小。最小生成树的求解算法有多种,其中两种常用的算法是 Prim 算法和 Kruskal 算法。
2.1 Prim 算法
Prim 算法是一种贪心算法,从一个节点开始,逐步扩展最小生成树的边。具体步骤如下: 1. 选择一个起始节点作为最小生成树的根节点。 2. 在当前最小生成树的所有节点中选择一个与该树相连接的权重最小的边,将其加入最小生成树。 3. 将该节点标记为已访问。 4. 重复步骤 2 和步骤 3,直到所有节点都被访问。
2.2 Kruskal 算法
Kruskal 算法也是一种贪心算法,通过不断选择权重最小的边来构建最小生成树。具体步骤如下: 1. 对所有边按照权重进行排序。 2. 依次选择权重最小的边,如果该边的两个端点不在同一个连通分量中,则将该边加入最小生成树,并将这两个端点合并到同一个连通分量中。 3. 重复步骤 2,直到所有节点都在同一个连通分量中,即最小生成树构建完成。
3. 实验步骤
本实验将使用 Prim 算法和 Kruskal 算法分别求解给定图的最小生成树。
3.1 数据准备
首先,我们需要准备一个具有权重的连通图作为实验数据。假设该图有 n 个节点和 m 条边,我们可以使用邻接矩阵或邻接表来表示这个图。
最小生成树算法实验报告
最小生成树算法
问题描述
设G=(V,E)是一个无向连通带权图,E中每条边(v,w)的权为c(v,w)。如果G 的一个子图G'是一棵包含G的所有顶点的书,则称G'为G的生成树。生成树上各边权的总和称为该生成树的耗费,在G的所有生成树中,耗费最
小的生成树就称为G的最小生成树。给定一个无向连通带权图,构造一个最小生成树。
设计思想
利用Prim 算法求最小生成树,Prim 算法是利用贪心策略设计的算法。
设G=(V,E)是一个连通带权图,V={1, 2,…,n}。构造G的一棵最小生成树的Prim算法的基本思想是:首先置U={1},然后,只要U是V的真子集,就做如下的贪心选择:选取满足条件i € U,j € V-U,且使c(i,j)达到最小的边(i,j), 并将顶点j添加到U中。这个过程一致进行到U=V时为止。在这个过程中选取到的所有边恰好构成G的一棵最小生成树。
时间复杂度
Prim 算法的Pascal 语言描述如下:
Procedure PRIM(c:array[1..n,1..n] of real);
Var
lowcost:array[1..n] of real; closest:array[1..n] of integer;
i,j,k,min,integer; begin
(I)for i:=2 to n do
⑵begin{初始化,此时U只含有顶点1}
(3)lowcost[i]:=c[1,i];
(4)Closest[i]:=1;
(5)end;
(6)for i:=2 to n do
(7)begin {寻找顶点分别在V-U与U中边权最小的边}
数据结构实验报告 最小生成树
实验报告六
(数学学院08级4班080204015 余燕川)
实验目的:
通过对图的基本知识的学习, 掌握图的基本概念, 构造最小生成树, 在此基础上上机实践, 调试程序。
实验题目:
对一个给定的图G(V, E), 构造最小生成树。
三、实验分析:
1.假设网G(V, E)是连通的, 从顶点u出发构造G的最小生成树T, 开始时, 记
T=(U, B), 其中U是T顶点集合, B是T的边集合;
2、开始时U={u0 }( u0 ∈V)B=空,重复执行下述操作:在所有的u ∈U,V∈V-U组成的边(u,v)中找出一条权值最小的边(u0,v0)并入边集B中,同时将v0加入顶点集U,直到U=V为止, 此时T中必中必有n-1条边, 则T=(U, B)为G的最小生成树。
四、实验部骤:
(1)构写程序的大体框架;
(2)具体编写每个操作的程序;
(3)程序的检查;
(4)程序的调试;
五、程序调试问题:
输入顶点后, 边的信息输不进去;如下图:
六、实验结果:
输入顶点数为5, 边数为8, 顶点为v1,v2,v3,v4,v5;后面出现了问题。
七、实验程序:
#define MAXSIZE 100
#define max 10
typedef char datatype;
typedef struct
{
datatype vexs[MAXSIZE];
int edges[MAXSIZE][MAXSIZE];
int n,e;
}graph;
struct{
char end;
int len;
}minedge[max];
void Creatgraph(graph *ga)
最小生成树-课程设计报告
课程设计报告
问题描述:已知一个无向连通网表示n个城市以及城市间可能设置的通信线
路,其中网的顶点表示城市,边表示两个城市之间的线路,赋于边上的权值表示相应的代价。对于n个点的连通网能建立许多不同的生成树,每一棵生成树都可以是一个通信网。我们要选择一棵生成树,使总的耗费最小
(1)需求分析:
在N地建设网络保证连通即可求最小的架设方式,任务完成可分为两个部分:
A 存储N中任意两地之间的权(采用邻接表,邻接矩阵)
B 用prim和克鲁斯卡尔两种算法分别求出N地中最优架设方式即最小生成树。
C 按顺序输出生成树中各条边以及它们的权值。
(2)概要设计:
程序分为两大部分 1 存储部分,2 算法部分;存储部分分为邻接矩阵和邻接表,而且包含了两者直接的互相转换;算法部分分为普里母算法和克鲁斯卡尔算法。
Prim算法的思想:
假设V是图中顶点的集合,E是图中边的集合,TE为最小生成树中的边的集合,则prim算法通过以下步骤可以得到最小生成树:
1:初始化:U={u 0},TE={f}。此步骤设立一个只有结点u 0的结点集U 和一个空的边集TE作为最小生成树的初始形态,在随后的算法执行中,这个形态会不断的发生变化,直到得到最小生成树为止。
2:在所有u∈U,v∈V-U的边(u,v)∈E中,找一条权最小的边(u 0,v 0),将此边加进集合TE中,并将此边的非U中顶点加入U中。此步骤的功能是在边集E中找一条边,要求这条边满足以下条件:首先边的两个顶点要分别在顶点集合U和V-U中,其次边的权要最小。找到这条边以后,把这条边放到边集TE中,并把这条边上不在U中的那个顶点加入到U中。这一步骤在算法中应执行多次,每执行一次,集合TE和U都将发生变化,分别增加一条边和一个顶点,因此,TE和U是两个动态的集合,这一点在理解算法时要密切注意。
实验5 最小生成树算法的设计与实现(报告)
实验5 最小生成树算法的设计与实现
一、实验目的
1、根据算法设计需要, 掌握连通图的灵活表示方法;
2、掌握最小生成树算法,如Prim、Kruskal算法;
3、基本掌握贪心算法的一般设计方法;
4、进一步掌握集合的表示与操作算法的应用。
二、实验内容
1、认真阅读算法设计教材和数据结构教材内容, 熟习连通图的不同表示方法和最小生成树算法;
2、设计Kruskal算法实验程序。
有n个城市可以用(n-1)条路将它们连通,求最小总路程的和。
设计测试问题,修改并调试程序, 输出最小生成树的各条边, 直至正确为止。
三、Kruskal算法的原理方法
边权排序:
1 3 1
4 6 2
3 6 4
1 4 5
2 3 5
3 4 5
2 5 6
1 2 6
3 5 6
5 6 6
1. 初始化时:属于最小生成树的顶点U={}
不属于最小生成树的顶点V={1,2,3,4,5,6}
2. 根据边权排序,选出还没有连接并且权最小的边(1 3 1),属于最小生成树
的顶点U={1,3},不属于最小生成树的顶点V={2,4,5,6}
3. 根据边权排序,选出还没有连接并且权最小的边(4 6 2),属于最小生成树的顶点U={{1,3},{4,6}}(还没有合在一起,有两颗子树),不属于最小生成树的顶点V={2,5}
4. 根据边权排序,选出还没有连接并且权最小的边(3 6 4),属于最小生成树的顶点U={1,3,4,6}(合在一起),不属于最小生成树的顶点V={2,5}
5. 根据边权排序,选出还没有连接并且权最小的边(3 6 4),属于最小生成树的顶点U={1,2,3,4,6},,不属于最小生成树的顶点V={5}
数据结构实验报告-最小生成树(精选5篇)
数据结构实验报告-最小生成树(精选5篇)
第一篇:数据结构实验报告-最小生成树
电子科技大学
实
验
报
告
学生姓名:XXX 学号:
20***
指导教师:刘峤实验地点:信软楼306
实验时间:5月17日
一、实验室名称:软件实验室
二、实验项目名称:数据结构与算法—图
三、实验学时:4
四、实验原理:
Kruskal 算法是一种按照图中边的权值递增的顺序构造最小生成树的方法。其基本思想是:设无向连通网为G=(V,E),令G 的最小生成树为T,其初态为T=(V,{}),即开始时,最小生成树T 由图G 中的n 个顶点构成,顶点之间没有一条边,这样T 中各顶点各自构成一个连通分量。然后,按照边的权值由小到大的顺序,考察G 的边集E 中的各条边。若被考察的边的两个顶点属于T 的两个不同的连通分量,则将此边作为最小生成树的边加入到T 中,同时把两个连通分量连接为一个连通分量;若被考察边的两个顶点属于同一个连通分量,则舍去此边,以免造成回路,如此下去,当T 中的连通分量个数为1 时,此连通分量便为G 的一棵最小生成树。
如教材153页的图4.21(a)所示,按照Kruskal 方法构造最小生成树的过程如图4.21 所示。在构造过程中,按照网中边的权值由小到大的顺序,不断选取当前未被选取的边集中权值最小的边。依据生成树的概念,n 个结点的生成树,有n-1 条边,故反复上述过程,直到选
取了n-1 条边为止,就构成了一棵最小生成树。
五、实验目的:
本实验通过实现最小生成树的算法,使学生理解图的数据结构存储表示,并能理解最小生成树Kruskal 算法。通过练习,加强对算法的理解,提高编程能力。
数据结构课程设计报告(最小生成树)
《数据结构》课程设计报告
课程名称:最小生成树
课题负责人名(学号):
同组成员名单(角色):
指导教师:
评阅成绩:
评阅意见:
提交报告时间:2011年12月19日
最小生成树
计算机科学与技术专业
学生:指导老师:
[摘要]选择一颗生成树,使之总的消费最少,也就是要构造连通网的最小代价生成树(简称为最小生成树)的问题,一颗生成树的代价就是树上各边的代价之和,构造最小生成树可以有多种算法,其中多数算法利用了MST的性质。
关键词:最小生成树连通图普里姆算法克鲁斯卡尔算法 MST
一、设计目的
1.了解并掌握数据结构与算法的设计方法,具备初步的独立
分析和设计能力;
2.初步掌握软件开发过程的问题分析、系统设计、程序编码、
测试等基本方法和技能;
3.提高综合运用所学的理论知识和方法独立分析和解决问题
的能力;
4.训练用系统的观点和软件开发一般规范进行软件开发,培
养软件工作者所应具备的科学的工作方法和作风。
二、算法思想分析
该设计的要求是在n个城市之间建设网络,不仅要保证连通,还要求是最经济的架设方法。根据克鲁斯卡尔和普里姆算
法的不同之处,该程序将城市个数大于十个时应用普里姆算法求最小生成树,而城市个数小于十个时则应用克鲁斯卡尔进行计算。
1.算法思想
1)普里姆(Prim)算法思想
a)选择从0节点开始,并选择0节点相关联的最小权值
边,将与这条边相关联的另一顶点出列;
b)在出列的节点中相关联的所有边中选择一条不与另一
个已出列的节点相关联的权值最小的边,并将该边相
关联的节点出列;
c)重复b)直到所有的节点出列。
2)克鲁斯卡尔(Kruskal)算法思想
数据结构-最小生成树实验报告
#include<stdio.h>
#include<stdlib.h>
#define MAXLEAF 100
#define INF 100000
#define EDGENUMBER MAXLEAF*MAXLEAF/2
typedef int EdgeType;
typedef int VertexType;
typedef struct{
EdgeType val[MAXLEAF][MAXLEAF];
VertexType ves[MAXLEAF];
int v;
int e;
}MGraph;
typedef struct{
int vex1,vex2;
int w;
}kedge;
void creat_MGraph(MGraph *M){
int i,j,k;
int w;
printf("请输入图的顶点个数及边数:\n");
scanf("%d%d",&(M->v),&(M->e));
printf("请依次填充顶点信息:\n");
for(i=0;i<M->v;i++)
scanf("%d",&(M->ves[i]));
for(i=0;i<M->v;i++)
for(j=0;j<M->v;j++)
if(i==j) M->val[i][j]=0;
else M->val[i][j]=INF;
printf("请依次输入图的边两个顶点顶点的权值:(格式:a b c)\n");
for(k=0;k<M->e;k++)
{
scanf("%d%d%d",&i,&j,&w);
c++实验报告最小生成树
本科学生设计性实验报告
项目组长______ 学号________
成员 _____________________________
专业一软件工程班级_______
实验项目名称__________
指导教师及职称 _________
开课学期2012至2013年第一学期
上课时间2012年12月3日至12月24日
1、实验目的:
通过实现某复杂算法,使学生理解数据结构基本概念、掌握栈、队列、树、图等的应用等,熟练使用C或者C++巩固同学们在课堂上所学的知识激发同学们主动学习和应用新知识的意识。
本设计性实验由学生在下列题目中任选,或自拟题目:
多项式求解;哈夫曼编码;迷宫求解;表达式求值;银行排队系统模拟;最小生成树;拓扑排序;最短路径;关键路径
2、实验场地及仪器、设备和材料:实验场地:实验室?
仪器设备:联想台式机一台,Microsoft Visual C++ 6.0
#in elude <iostream> using n amespace std;
class Min iSpa nTree
{
private:
int arcs[100][100];
int vexnum;
int edge;
int lowcost[100];
int closest[100]; public:
void creatGraph()
{
int m[100][100];
cout<<"请输入顶点数:” cin> >vex num;
cout<<"请输入边的数:”
cin> >edge;
最小生成树课程设计报告
数据结构课程设计
学院
专业
班级
姓名
学号
指导教师
2011 年x 月x 日
一.需求分析
1.可以用连通网来表示n个城市间可能设置的通信网络,其中网的顶点表示城市,边表示两城市之间的路线,边的权值表示相应的费用。
对于n个顶点的连通网可以建立许多不同的生成树,每一棵生成树都可以是
一个通信网。现在,我们要选择这样一棵生成树,它使总的费用最少,这棵树就是最小生成树。一棵生成树的费用就是树上各边的费用之和。
2.本程序的目的是要建设一个最经济的通信网,根据用户输入的网,输出相应的最小生成树。在这里城市以及两城市之间的费用都用整型数来代替。
3.程序执行的命令包括:
(1)利用克鲁斯卡尔算法求最小生成树。
(2)构造最小生成树中的连通分量。
(3)权值应存放在定义的数组中。
(4)输入城市个数。
(5)用堆排序找出权值最小的边。
(6)输出费用最少的生成树并将数据存放在文本文档中。
(7)结束。
4.测试数据
用户自定义输入城市个数即图的顶点数及边数,输入结束后回车即显示生成的最小生成树及最小开销。
二.概要设计
1:抽象数据类型MFSet的定义:
ADT MFSet {
数据对象:若设S是MFSet型的集合,则它由n(n>0)个子集Si(i = 1,2...,n)构成,每个子集的成员代表在这个子集中的城市。
数据关系: S1 U S2 U S3 U... U Sn = S, Si包含于S(i = 1,2,...n)
Init (n): 初始化集合,构造n个集合,每个集合都是单成员,根是其本身。rank 数组初始化0
Find(x):查找x所在集合的代表元素。即查找根,确定x所在的集合,并路径压缩。
离散数学--最小生成树实验报告
创作编号:
GB8878185555334563BT9125XW
创作者:凤呜大王*
一、实验目的:掌握图的存储表示和以及图的最小生成树算法。
二、实验内容:
1.实现图的存储,并且读入图的内容。
2.利用克鲁斯卡尔算法求网络的最小生成树。
3.实现构造生成树过程中的连通分量抽象数据类型。
4.以文本形式输出对应图的最小生成树各条边及权值。
三、实验要求:
1.在上机前写出全部源程序;
2.能在机器上正确运行程序;
3.用户界面友好。
需求分析:
1、利用克鲁斯卡尔算法求网的最小生成树;
2、以用户指定的结点为起点,分别输出每种遍历下的结点访问序列;
3、输入为存在边的顶点对,以及它们之间的权值;输出为所得到的邻
接矩阵以及按权排序后的边和最后得到的最小生成树;
克鲁斯卡尔算法:假设WN=(V,{E}) 是一个含有n 个顶点的连通网,按照构造最小生成树的过程为:先构造一个只含n 个顶点,而边
集为空的子图,之后,从网的边集 E 中选取一条权值最小的边,若该条边的两个顶点分属不同的树,则将其加入子图,反之,若该条边的两个顶点已落在同一棵树上,则不可取,而应该取下一条权值最小的边再试之。依次类推,直至只有一棵树,也即子图中含有n-1条边为止。
测试数据:
自行指定图进行运算
四、详细设计
源程序
#include<stdio.h>
#include<stdlib.h>
#define M 20
#define MAX 20
typedef struct
{
int begin;
int end;
int weight;
}edge;
最小生成树实验报告
数据结构课程设计报告题目:最小生成树问题
院(系):计算机工程学院
学生姓名:
班级:学号:
起迄日期:
指导教师:
2011—2012年度第 2 学期
一、需求分析
1.问题描述:
在n个城市之间建设网络,只需保证连通即可,求最经济的架设方法。存储结构采用多种。求解算法多种。
2.基本功能
在n个城市之间建设网络,只需要架设n-1条线路,建立最小生成树即可实现最经济的架设方法。
程序可利用克鲁斯卡尔算法或prim算法生成最小生成树。
3.输入输出
以文本形式输出最小生成树,同时输出它们的权值。通过人机对话方式即用户通过自行选择命令来输入数据和生成相应的数据结果。
二、概要设计
1.设计思路:
因为是最小生成树问题,所以采用了课本上介绍过的克鲁斯卡尔算法和 prim算法两种方法来生成最小生成树。根据要求,需采用多种存储结构,所以我选择采用了邻接表和邻接矩阵两种存储结构。
2.数据结构设计:
图状结构:
ADT Graph{
数据对象V:V是具有相同特性的数据元素的集合,称为顶点集。
数据关系R:R={VR}
VR={<v,w>|v,w∈V且P(v,w),<v,w>表示从v到w的弧,
谓词P(v,w)定义了弧<v,w>的意义或信息}
基本操作:
CreateGraph( &G, V, VR )
初始条件:V是图的顶点集,VR是图中弧的集合。
操作结果:按V和VR的定义构造图G。
DestroyGraph( &G )
初始条件:图G存在。
操作结果:销毁图G。
LocateVex( G, u )
初始条件:图G存在,u和G中顶点有相同特征。
最小生成树-实验报告
实验五最小生成树
一、需求分析
1、本程序的目的是要建设一个最经济的网,,输出相应的最小生成树。在这里都用整型数来代替。
2、测试数据
见下程序。
二、概要设计
主程序:
int main()
{
初始化;
while (条件)
{
接受命令;
处理命令;
}
return 0;
}
三、详细设计
#include//头文件
using namespace std;
#define MAX_VERTEX_NUM 20//最大结点数
#define MAX 200
typedef struct Close//结构体
{
char adjvex;
int lowcost;
}Close,close[MAX_VERTEX_NUM];
typedef struct ArcNode
{
int adjvex;
ArcNode *nextarc;
int info;
}ArcNode;
typedef struct VNode
{
char data;
ArcNode *firstarc;
}VNode,AdjList[MAX_VERTEX_NUM];
typedef struct
{
AdjList verties;
int vexnum,arcnum;
}ALGraph;
ALGraph G;//对象G
int LocateVek(ALGraph ,char );//返回结点位置
int minimum(close);//返回最小数
void MinSpanTree_PRIM(ALGraph,char);//最小生成树
void Create(ALGraph &);//创建邻接表
int main()
prim计算实验报告
prim计算实验报告
Prim计算实验报告
引言:
Prim算法是一种常用的图论算法,用于解决最小生成树问题。在本次实验中,
我们通过使用Prim算法,对一个给定的图进行计算,并得出最小生成树。
一、实验目的
本次实验的目的是熟悉Prim算法的原理和实现方法,通过实际操作,了解算法的具体过程和效果。同时,通过对比实验结果,探讨Prim算法在不同图结构下的优劣势。
二、实验方法
1. 算法原理
Prim算法是一种贪心算法,它从一个顶点开始,逐步扩展最小生成树的边集合,直到包含所有顶点为止。具体步骤如下:
(1)选择一个起始顶点,将其加入最小生成树的顶点集合。
(2)从与选定顶点相连的边中,选择一条权值最小的边,将其加入最小生成树的边集合。
(3)将新加入的顶点也加入最小生成树的顶点集合。
(4)重复步骤(2)和(3),直到最小生成树的顶点包含所有顶点。
2. 实验步骤
(1)读取图的数据,构建邻接矩阵表示图的结构。
(2)选择一个起始顶点,将其加入最小生成树的顶点集合。
(3)从与选定顶点相连的边中,选择一条权值最小的边,将其加入最小生成树
的边集合。
(4)将新加入的顶点也加入最小生成树的顶点集合。
(5)重复步骤(3)和(4),直到最小生成树的顶点包含所有顶点。
(6)输出最小生成树的边集合和权值。
三、实验结果
我们选择了一个具有10个顶点和15条边的图进行实验。经过计算,得出的最小生成树的边集合和权值如下:
边集合:(1, 2),(1, 3),(2, 4),(2, 5),(3, 6),(4, 7),(4, 8),(5, 9),(6, 10)
数据结构实验最小生成树
数据结构实验最小生成树
数据结构实验报告
最小生成树问题
一、问题描述:
若要在n个城市之间建设通信网络,只需要架设n-1条线路即可。如何以最低的经济代价建设这个通信网,是一个网的最小生成树问题基本要求
(1)从文件中读入图的信息。
(2)利用克鲁斯卡尔算法求网的最小生成树。
(3)以文本形式生成树中各条边以及他们的权值。二(需求分析:
1、需定义结构体数组,根据权值逐一选择边。
三(概要设计
抽象数据类型:
需定义结构体数组,存储每条边的起点,终点,权值。
算法的基本思想:
1、图的信息的读取:
定义结构体数组,存储每条边的起点,终点,权值。 2、对每条边在数组中的位置处理:
选边需从最小的开始,故按边的权值从小到大进行排序。 3、边的选取: 从最小的边的开始,若边的两端点不属于同一集合,则选
取该边。并将该边的两个顶点所在的两个集合合并成为一个。
因为有n个顶点,故只需选取n-1条边。
程序的流程:
(1) 输入模块: 读入图的信息(顶点和边,用结构体数组进行
存储)。
(2) 处理模块:Kruskal算法。
(3) 输出模块:将结果输出。
四(详细设计:
算法的具体步骤:
struct G{
int fromvex;
int endvex;
int weight;
}GE[100],cur[100];
void swap(G* GE,int i,int j){ //交换函数int temp=GE[i].fromvex;
GE[i].fromvex=GE[j].fromvex;
GE[j].fromvex=temp;
temp=GE[i].endvex;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验五最小生成树
一、需求分析
1、本程序の目の是要建设一个最经济の网,,输出相应の最小生成树。在这里都用整型数来代替。
2、测试数据
见下程序。
二、概要设计
主程序:
int main()
{
初始化;
while (条件)
{
接受命令;
处理命令;
}
return 0;
}
三、详细设计
#include
using namespace std;
#define MAX_VERTEX_NUM 20//最大结点数
#define MAX 200
typedef struct Close//结构体
{
char adjvex;
int lowcost;
}Close,close[MAX_VERTEX_NUM];
typedef struct ArcNode
{
int adjvex;
ArcNode *nextarc;
int info;
}ArcNode;
typedef struct VNode
{
char data;
ArcNode *firstarc;
}VNode,AdjList[MAX_VERTEX_NUM];
typedef struct
{
AdjList verties;
int vexnum,arcnum;
}ALGraph;
ALGraph G;//对象G
int LocateVek(ALGraph ,char );//返回结点位置
int minimum(close);//返回最小数
void MinSpanTree_PRIM(ALGraph,char);//最小生成树
void Create(ALGraph &);//创建邻接表
int main()
{
char a;int i=1;
Create(G);
/*for(int i=1;i<=G.vexnum;i++)
{
for(s=G.verties[i].firstarc;s!=NULL;s=s->nextarc)
cout< while(i) { cout<<"输入起点 : "; cin>>a; MinSpanTree_PRIM(G,a); cout<<"如果结束输入'0',否则输入'1':"; cin>>i; } return 0; } int LocateVek(ALGraph G,char u) { int i; for(i=1;i<=G.vexnum;i++) if(u==G.verties[i].data) return i; return -1; } int minimum(close m)//返回最小数 { int i=0,j,n=200; for(i=1;i<=G.vexnum;i++) if(m[i].lowcost { n=m[i].lowcost; j=i; } return j; } void MinSpanTree_PRIM(ALGraph G,char u) { int j,k,a; close closedge;ArcNode *s,*p,*q; for(j=1;j<=MAX_VERTEX_NUM;j++) closedge[j].lowcost=MAX;//把所有值都赋为最大 k=LocateVek(G,u); for(j=1;j<=G.vexnum;j++) if(j!=k) { closedge[j].adjvex=u; for(s=G.verties[k].firstarc;s!=NULL;s=s->nextarc) if(j==s->adjvex) {closedge[j].lowcost=s->info; break; } } closedge[k].lowcost=0; cout<<"最小生成树 : "<<"{";//查找并输出最小生成树 for(j=1;j { k=minimum(closedge); cout<<"("< < closedge[k].lowcost=0; for(int i=1;i<=G.vexnum;i++) { for(p=G.verties[k].firstarc;p!=NULL;p=p->nextarc) if(p->info { closedge[i].adjvex=G.verties[k].data; closedge[i].lowcost=p->info; } } }cout<<"}"< cout<<"边及对应权值: "< for(j=G.vexnum;j>=1;j--) { if(closedge[j].lowcost==0&&G.verties[j].data!=u) { cout<<"("< <<","< <<") =="; a=closedge[j].adjvex; for(q=G.verties[j].firstarc;q!=NULL;q=q->nextarc) if(a-64==q->adjvex) cout< } } } void Create(ALGraph &G) { int i,j,k,x; char a,b;ArcNode *s; cout<<"输入顶点数(1-20):"; cin>>G.vexnum; cout<<"输入边数:"; cin>>G.arcnum; cout<<"输入顶点信息:"< for(i=1;i<=G.vexnum;i++) { cin>>G.verties[i].data; G.verties[i].firstarc=NULL; } for(i=1;i<=G.arcnum;i++) { cout<<"输入相邻两结点和权值 "; cin>>a>>b;cin>>x; j=a-64;k=b-64;//将字符型转化成整数型 s=new ArcNode;