两种算法实现最小生成树

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构上机实验报告题目:两种算法实现最小生成树

学生姓名

学生学号

学院名称计算机学院

专业计算机科学与技术

时间 2014.12.9

目录

第一章需求分析 (1)

1.1 原题表述 (1)

1.2 问题解决方案 (1)

第二章概要设计 (2)

2.1 抽象数据类型 (2)

2.2 主要算法描述 (2)

2.1.1 Prim算法实现 (2)

2.1.2 Kruskal算法实现 (3)

2.3 主要算法分析 (3)

第三章概要设计 (4)

3.1 程序代码 (4)

3.1.1 Prim算法实现 (4)

3.1.2 Kruskal算法实现 (6)

第四章调试分析 (9)

4.1 出现的问题及解决方法 (9)

第五章测试分析 (10)

5.1 测试样例 (10)

第一章需求分析

1.1 原题表述

某市为实现交通畅行,计划使全市中的任何两个村庄之间都实现公路互通,虽然不需要直接的公路相连,只要能够间接可达即可。现在给出了任意两个城镇之间修建公路的费用列表,以及此两个城镇之间的道路是否修通的状态,要求编写程序求出任意两村庄都实现公路互通的最小成本。

输入参数:测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( 1< N < 100 );随后的 N(N-1)/2 行对应村庄间道路的成本及修建状态,每行给4个正整数,分别是两个村庄的编号(从1编号到N),此两村庄间道路的成本,以及修建状态:1表示已建,0表示未建。当N为0时输入结束。

输出参数:每个测试用例占输出的一行,输出实现后所需的最小成本值

1.2 问题解决方案

第一种方案:使用Prim算法

首先以一个结点作为最小生成树的初始结点,然后以迭代的方式找出与最小生成树中各结点权重最小边,并加入到最小生成树中。加入之后如果产生回路则跳过这条边,选择下一个结点。当所有结点都加入到最小生成树中之后,就找出了连通图中的最小生成树了。

第二种方案:使用kruskal算法

算法过程:1.将图各边按照权值进行排序2.将图遍历一次,找出权值最小的边,(条件:此次找出的边不能和已加入最小生成树集合的边构成环),若符合条件,则加入最小生成树的集合中。不符合条件则继续遍历图,寻找下一个最小权值的边。3.递归重复步骤1,直到找出n-1条边为止(设图有n个结点,则最小生成树的边数应为n-1条),算法结束。得到的就是此图的最小生成树。

第二章概要设计

2.1 抽象数据类型

ADT Graph {

数据对象V:V是具有相同特性的数据元素的和,称为顶点级。

数据关系R:

R = {VR}

VR = {|v,w V 且 P(v,w),表示从v到w的弧,

谓词P(v,w)定义了弧的意义或信息} 基本操作:

CreatGraph(&G,V)

初始条件:v是顶点数量

操作结果:构造含有V个顶点的图G

Prim(G)

初始条件:图G存在

操作结果:找到图G中最小生成树

Kruskal(G)

初始条件:图G存在

操作结果:找到图G中最小生成树

}ADT Graph

2.2 主要算法描述

2.1.1 Prim算法实现

2.2.2 Kruskal算法实现

2.3 主要算法分析

Prim算法时间复杂度为O(n2),与图中顶点个数有关,而与边数无关。

Kruskal算法时间复杂度为O(eloge),与途中的边数有关,而与顶点数无关。

第三章详细设计

3.1 程序代码

3.1.1 Prim算法实现

#include

#define NUM 200 //最大顶点数

#define MAX 40000 //最大值

//定义邻接矩阵的结构

typedef struct

{

int edges[NUM][NUM]; //邻接矩阵

int n; //顶点数

int e; //边数

}MGraph;

//构造邻接矩阵,v表示顶点数

void CreatGraph(MGraph &G, int v)

{

G.n = v;

G.e = v * (v - 1) / 2;

for(int i = 1; i <= G.n; i++){ //初始化邻接矩阵

for(int j = 1; j <= G.n; j++){

G.edges[i][j] = MAX;

}

}

for(int i = 1; i <= G.e; i++){ //构造邻接矩阵

//v1,v2一条路连接的两村庄,cost修路费用,build修建状态

int v1, v2, cost, build;

scanf("%d%d%d%d", &v1, &v2, &cost, &build);

if(build == 1)

cost = 0;

G.edges[v1][v2] = cost;

G.edges[v2][v1] = cost;

}

}

int Prim(MGraph G)

{

int result = 0; //用于记录修路成本

int lowcost[NUM]; //存放生成树顶点集合内顶点到生成树外各顶点的各边上

相关文档
最新文档