1、石大远程在线考试数据结构课程设计建立通信网络参考答案中国石油大学(北京)远程教育学院数据结构课程设计报告石大远程在线考试数据结构建立通信网络第二题参考答案、尾号3,4,51需求分析在n个城市建设通信网络,只需架设n-1条线路即可。设计算法,求出如果以最低的经济代价建设这个通信网络。要求如下:(1) 至少包含10个城市;(2) 城市数n由键盘录入;(3) 城市坐标由随机函数产生小于100的整数;(4) 输出生成树中各条边以及它们的权值;2概要设计 图的存储:用邻接矩阵,这样会方便不少。邻接矩阵是一个二维数组,数组中的元素是边的权(一些数值),数组下标号为结点的标号。(1)例如二维数组中的一个元素
2、M56的值为39,则表示结点5、6连接,且其上的权值为39。(2)用邻接矩阵存储图,对图的读写就简单了。因为邻接矩阵就是一个二维数组,因此对图的读写就是对二维数组的操作。只要能弄清楚边的编号,就能把图读入了。3详细设计 /最短路径#ifndef MYGRAPH_H_#define MYGRAPH_H_class MyGraphpublic: void readDirectedGraph(); MyGraph(int size);/构造函数中设置图的大小,分配空间 void writeGraph(); void shortPath(int source);/求最短路径 protected:pri
3、vate: int *m_graph;/用二维数组保存图 int m_size;/图的大小 ;#endif/构造函数中设置图的大小,分配空间MyGraph:MyGraph(int size) int i,j; m_size=size; /给图分配空间 m_graph=new int* m_size; for (i=0;im_size;i+) m_graphi=new intm_size; for (i=0;im_size;i+) for(j=0;jm_size;j+) m_graphij=INT_MAX; 4程序测试 5感想与体会 本次实验主要是学习掌握图的存储结构,学会编写求最短路径的算法。
4、本次实验的算法虽有点复杂,但是多上机练习,完成本次实验也不是难事。通过这次课程设计,我收获了不少的东西。我选择的题目是最小生成树,这个问题看这简单,但是做起来有非常大的困难。平时我们很注重理论学习,但现在看来,实践也是非常重要的,两者缺一不可。在这期间我遇到了不少的问题,问同学,查资料,虽然过程是辛苦琐碎的,但最后成果出来还是很鼓舞人心的。#include#include #include #include #include using namespace std;struct primnodepublic: char begvex; char endvex; int lowcost;stru
5、ct adknode int dist;/最近距离 char way50;/顶点数组 int nodenum;/经过的顶点数;class Mgraph/邻接矩阵储存结构public: Mgraph() Mgraph() void CreatMGraph(); void DFS (int );/用递归实现 void DFS1(int );/非递归 void BFS(int ); void print(); void prim(); int mini(); int low();/最短距离函数的辅助函数 int LocateVex(char); void kruskal(); void Dijkst
6、ra(); void Floyd();private: int number;/顶点数目 int arcnum;/边的数目 char vexs50; int arcs5050; int visited50;/便利时的辅助工具 primnode closeedge50;/prim adknode dist50;/最短路径 int D2020;/floyd算法距离 int P202020;/floyd算法路径; int Mgraph:LocateVex(char s) for(int i=0;inumber;i+) if (vexsi=s) return i; return -1;void Mgr
7、aph:print() cout顶点为: ; for(int k=0;knumber;k+) coutvexsk; coutendl; for(int i=0;inumber;i+) for(int j=0;jnumber;j+) coutsetw(6)leftarcsij ; coutendl; for(int m=0;mnumber;m+) coutvisitedm; coutendl;void Mgraph:CreatMGraph()/图的邻接矩阵储存结构 char vex1,vex2; int i,j,k,m; cout请输入定点数,边数:numberarcnum; cout请输入顶点
8、(字符串类型):endl; for(i=0;ivexsi; for(i=0;inumber;i+) for(j=0;jnumber;j+) arcsij=1000; for(k=0;karcnum;k+) cout请输入边的两个顶点及边的权值: vex1vex2m; i=LocateVex(vex1); j=LocateVex(vex2); arcsij=m; arcsji=m; void Mgraph:DFS(int i=0)/用递归实现 int j; coutvexsi; visitedi=1; for (j=0;jnumber;j+) if(!(arcsij=1000)&!visited
9、j) DFS(j); void Mgraph:DFS1(int i=0)/非递归 stack st; st.push(i); while(!st.empty() int j=st.top(); st.pop(); coutvexsj; visitedj=1; for(int k=0;knumber;k+) if(!(arcsjk=1000)&!visitedk) st.push(k); void Mgraph:BFS(int i=0)/广度优先遍历 deque de; de.push_back(i); coutvexsi; visitedi=1; while(!de.empty() int k
10、=de.front(); for(int j=0;jnumber;j+) if(arcskj!=1000&!visitedj) coutvexsj; visitedj=1; de.push_back(j); de.pop_front(); int Mgraph:mini() static int i; int min=0; for (int j=0;jcloseedgej.lowcost) min=j; i=min; cout包括边(closeedgei.begvex,closeedgei.endvex); return i;void Mgraph:prim() char u; cout请输入
11、起始顶点:u; int i=LocateVex(u); visitedi=1; for(int j=0;jnumber;j+) closeedgej.begvex=u; closeedgej.endvex=vexsj; closeedgej.lowcost=arcsij; for (int m=1;mnumber;m+) int n=mini(); visitedn=1; closeedgen.lowcost=1000; for (int p=0;pnumber;p+) if(!visitedp) if(arcspncloseedgep.lowcost) closeedgep.lowcost=
12、arcspn; closeedgep.begvex=vexsn; void Mgraph:kruskal() int a,b,k=0; int min=1000; int arcs12020; for (int m=0;mnumber;m+) visitedm=m;/每一个顶点属于一颗树 for (int i=0;inumber;i+) for(int j=0;jnumber;j+) arcs1ij=arcsij; while (knumber-1) min=1000; for (int i=0;inumber;i+) for (int j=0;jnumber;j+) if (arcs1ijm
13、in) a=i; b=j; min=arcs1ij; if (visiteda!=visitedb) cout包括边(vexsa,vexsb); k+; for (int n=0;nnumber;n+) if (visitedn=visitedb) visitedn=visiteda; else arcs1ab=arcsba=1000; void Mgraph:Dijkstra() cout请输入起始点u; int i=LocateVex(u); visitedi=1; for (int j=0;jnumber;j+) distj.dist=arcsij; distj.nodenum=0; f
14、or (j=1;jnumber;j+) int distance=1000; int min=0; for (int n=0;ndistn.dist) distance=distn.dist; min=n; int m=min; visitedm=1; for (n=0;nnumber;n+) if(!visitedn) if(distm.dist+arcsmn)distn.dist) distn.dist=distm.dist+arcsmn; distn.nodenum=0; for (int x=0;xdistm.nodenum;x+) distn.wayx=distm.wayx; dis
15、tn.nodenum+; distn.waydistn.nodenum+=vexsm; /输出功能 for (int n=0;nnumber;n+) if (n!=i) if(distn.dist1000) coutvexsi到vexsn的最近距离为:distn.distendl; cout经过的顶点为:vexsi; for (int p=0;pdistn.nodenum;p+) coutdistn.wayp; coutvexsnendl; else coutvexsi到vexsn没有通路endl; void Mgraph:Floyd() int i,j,m,n; for ( i=0;inum
16、ber;i+) for ( j=0;jnumber;j+) for (m=0;mnumber;m+) Pijm=0; for ( i=0;inumber;i+) for ( j=0;jnumber;j+) Dij=arcsij; if(Dij1000) Piji=1; Pijj=1; for ( i=0;inumber;i+) for ( j=0;jnumber;j+) for (m=0;mnumber;m+) if (i=j|j=m|i=m) continue; if (Dim+DmjDij) Dij=Dim+Dmj; for (n=0;nnumber;n+) Pijn=Pimn|Pmjn; for ( i=0;inumber;i+) for ( j=0;jnumber;j+) if (Dij1000) coutvexsi到vexsj的最近距离为:Dijendl; cout经过的顶点为:; for (m=0;mnumber;m+) if (Pijm) coutvexsm; coutendl; else if (i!=j) coutvexsi到vexsj没有通路endl; int main() Mgraph g; g.CreatMGraph(); g.Floyd(); return 0;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1