东北大学数据结构上机实验报告3
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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();