东北大学数据结构上机实验报告3

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

实验三树和图应用

一、实验目的

光纤管道铺设施工问题

问题描述

设计校园内有N个教学楼及办公楼,要铺设校园光纤网,如何设计施工方案使得工程总的造价为最省。

二、实验要求

设计校园光纤网铺设的最小生成树模拟程序。

1)采用邻接表或邻接矩阵存储结构。

2)分别采用普利姆算法和克鲁斯卡尔算法实现。

输入形式

对应的教学楼、办公楼数目n,各边权值即每栋楼之间的距离

输出形式

最小生成树,即总路程最小的路

程序功能

设计校园光纤网铺设的最小生成树模拟程序

三、设计概要

流程图

抽象数据类型的定义

class prims

{

private:

int n; //节点的个数

int graph_edge[99][4]; //图的边

int g; //图中边的个数

int tree_edge[99][4]; //树的边

int t; //树的边的个数

int s; //源节点

int T1[50],t1; // 第一部分

int T2[50],t2; //第二部分

public:

void input();

int findset(int);

void algorithm();

void output();

};

各程序模块之间的调用关系

四、详细设计

定义prims类

private中进行对图的创建

public:

void input();

int findset(int);

void algorithm();

void output();

开始界面

实现prims类中图的初始化

分别输入图中的顶点个数、图的边及其权值

算法构造

t=0;//初始化边的个数为0

t1=1;

T1[1]=1; //资源节点

t2=n-1;

int i;

for(i=1;i<=n-1;i++)

T2[i]=i+1;

cout<<"\n\n*****运算开始*****\n\n\n";

while(g!=0 && t!=n-1)

{

int min=99;

int p;

int u,v,w;

for(i=1;i<=g;i++)

{

if(findset(graph_edge[i][1])!=findset(graph_edge[i][2])) //如果u和v在不同的部分{

if(min>graph_edge[i][3])

{

min=graph_edge[i][3];

u=graph_edge[i][1];

v=graph_edge[i][2];

w=graph_edge[i][3];

p=i;

}

}

}

for(int l=p;l

{

graph_edge[l][1]=graph_edge[l+1][1];

graph_edge[l][2]=graph_edge[l+1][2];

graph_edge[l][3]=graph_edge[l+1][3];

}

t++;

tree_edge[t][1]=u;

tree_edge[t][2]=v;

tree_edge[t][3]=w;

}

运算结果的输出

cout<<"挑选出的边及其对应的权值::\n";

for(int i=1;i<=t;i++)

cout<<"<"< ::"<

五、调试分析

所遇问题的解决方法及分析

开始时,我并不知道应该要怎样建立图和最小生成树之间的关系,而这个问题如若无法解决,那么普利姆算法就无从提起了。因此,在查阅了资料后,我将图和最小生成树放在一个类中,这样,通过函数操作就会容易很多。

算法的时空分析及改进设想

O(n^2)

经验和体会

通过此次程序的编译过程,我更深刻的了解到有一个清晰的思路对于编程的重要性。在编程之前需要经过充分的构思,就像写作先列提纲一样,只有拥有一个清晰的思路,编程序时才能一气呵成,否则只能是编到哪里是哪里,很容易卡壳,耽误时间是一方面,而且会使编出的程序没有连贯性。

六、使用说明

1、输入图的边数

2、输入各边的权值

3、程序打印出图中顶点可建立的关系网

4、程序开始运算

5、程序打印出最小生成树及其各边的权值

七、测试结果(截屏)

八、附录

#include

using namespace std;

class prims

{

private:

int n; //节点的个数

int graph_edge[99][4]; //图的边int g; //图中边的个数

int tree_edge[99][4]; //树的边int t; //树的边的个数

int s; //源节点

//把图分成两个部分

int T1[50],t1; // 第一部分

int T2[50],t2; //第二部分

public:

void input();

相关文档
最新文档