一、问题描述 (2)二、课程设计目的 (2)三、概要设计 (2)四、问题实现的主要算法与分析 (3)五、数据信息 (3)六、源程序 (4)七、运行结果 (8)八、课程设计的小结 (9)九、参考文献 (10)一、问题描述1.若要在扬州大学的七个校区(广陵校区、盐阜校区、瘦西湖校区、农学院校区、工学院校区、水利学院校区、医学院校区)之间架设校园网,如何以最低的经济代价架设这个校园网。
2.利用二种方法(Prim算法和克鲁斯卡尔(Kruskual)算法生成校园网的架设方案3.分别对每种方法选定一组测试数据进行测试,验证程序的正确性。
二、课程设计目的课程设计的目的是培养学生综合程序设计的能力,训练学生灵活应用所学数据结构知识,独立完成问题分析、总体设计、详细设计和编程实现等软件开发全过程的综合实践能力。
巩固、深化学生的理论知识,提高编程水平,并在此过程中培养他们严谨的科学态度和良好的学习作风。
为今后学习其他计算机课程打下基础。
课程设计为学生提供了一个既动手又动脑,独立实践的机会,将书本上的理论知识和工作、生产实际有机地结合起来,从而锻炼学生分析问题、解决实际问题的能力,提高学生的编程序能力和创新意识。
三、概要设计1.Prim算法:ADT Graph{数据对象V:V是具有相同特性的数据元素的集合,成为顶点集。
数据关系R:R={VR}VR={(v,w)|v,w∈V,(v,w)表示v和w之间存在路径}基本操作P:min(closedge,n);初始条件:图G存在。
操作结果:求权值最小的弧尾顶点。
minspantree(u,n,closedge);初始条件:图G存在。
操作结果:求图G的最小生成数。
}ADT Graph2.Kruskal算法:ADT MGraph{数据对象V:V是具有相同特性的数据元素的集合,成为顶点集。
数据关系R:R={VR}VR={(v,w)|v,w∈V,(v,w)表示v和w之间存在路径}基本操作P:sort(edges,G)初始条件:图G存在。
操作结果:求按权值大小从小到大排序。
MinSpantree(G);初始条件:图G存在。
操作结果:求图G的最小生成数。
Find(parent,f);初始条件:parent是已经存在的集合,v是某个子集成员。
操作结果:查找函数。
返回父亲结点。
}ADT MGraph四、问题实现的主要算法与分析1.Prim算法(1)typedef struct{int adj,low;}edge:定义结构体edge,包含成员adj(顶点),low (权);(2)int min(edge closedge[],int n):求权值最小的弧尾顶点;(3)void minspantree(int u,int n,edge closedge[]):用Prim算法求最小生成树;(4)main():包括用文件打开方式调用数据创建一个图,并对其用Prim算法求最小生成树2.Kruskal算法(1)typedef struct{int begin;int end;int weight;}edge:定义结构体edge,包含成员begin(弧头),end(弧尾),weight(权值);typedef struct{int adj;int weight;}AdjMatrix[MAX][MAX]:定义结构AdjMatrix[MAX][MAX],包含成员包含成员adj(顶点),weight(权值);typedef struct{AdjMatrix arc;int vexnum,arcnum;}MGraph:定义结构体MGraph,包含成员AdjMatrix arc(AdjMatrix 型的成员),vexnum(顶点数),arcnum(边数);(2)void sort(edge edges[],MGraph *G):对权值进行从小到大的排序;(3)void MinSpanTree(MGraph *G):用Kruskal算法求最小生成树;(4)int Find(int *parent,int f):找尾;(5)void main():包括用文件打开方式调用数据创建一个图,并对其用Kruskal算法求最小生成树。
五、数据信息1:广陵校区 2:盐阜校区3:瘦西湖校区 4:农学院校区5:工学院校区 6:水利学院校区7:医学院校区;1 2 111 3 201 4 121 5 101 6 111 7 152 3 102 4 12 5 12 6 22 7 43 4 93 5 113 6 123 7 124 5 24 6 34 7 35 6 15 7 56 7 6六、源程序Prim算法:/* Note:Your choice is C IDE */#include"stdio.h"#define Max 200typedef struct{int adj,low;}edge;int G[20][20];int min(edge closedge[],int n){int i,t,l;t=100;for(i=1;i<=n;i++)if((closedge[i].low)&&(closedge[i].low<t)) {t=closedge[i].low;l=i;} return l;}void minspantree(int u,int n,edge closedge[]){int i,j,k;for(i=1;i<=n;i++)if(i!=u){ closedge[i].adj=u;closedge[i].low=G[u][i];}closedge[u].low=0;for(i=1;i<n;i++){k=min(closedge,n);printf("(%d,%d) %d\n",closedge[k].adj,k,closedge[k].low);closedge[k].low=0;for(j=1;j<=n;j++)if(G[k][j]<closedge[j].low){closedge[j].adj=k;closedge[j].low=G[k][j];}}}main(){edge closedge[20] ;int i,n,m,j,w,q;int u;FILE *fp;printf("1:广陵校区2:盐阜校区\n3:瘦西湖校区4:农学院校区\n5:工学院校区6:水利学院校区\n7:医学院校区\n");printf("please input vexnum and edgenum!\n");scanf("%d,%d",&n,&m);for(i=1;i<=n;i++)for(j=1;j<=n;j++)G[i][j]=100;if((fp=fopen("H:\\shuju.txt","r"))==NULL){printf("can not open file\n");exit(0);}printf("please input i,j,w:\n");for(q=1;q<=m;q++){fscanf(fp,"%d %d %d",&i,&j,&w);G[i][j]=G[j][i]=w;printf("%d %d %d\n",i,j,w);}fclose(fp);printf("please input start point!\n");scanf("%d",&u);minspantree(u,n,closedge);}Kruskal算法:/* Note:Your choice is C IDE */#include"stdio.h"#include"stdlib.h"#define M 20#define MAX 20typedef struct{int begin;int end;int weight;}edge;typedef struct{int adj;int weight;}AdjMatrix[MAX][MAX];typedef struct{AdjMatrix arc;int vexnum,arcnum;}MGraph;void sort(edge edges[],MGraph *G){int i,j,temp;for(i=1;i<G->arcnum;i++)for(j=i+1;j<=G->arcnum;j++){if(edges[i].weight>edges[j].weight) {temp=edges[i].begin;edges[i].begin=edges[j].begin;edges[j].begin=temp;temp=edges[i].end;edges[i].end=edges[j].end;edges[j].end=temp;temp=edges[i].weight;edges[i].weight=edges[j].weight;edges[j].weight=temp;}}}void MinSpanTree(MGraph *G){int i,j,n,m;int k=1;int parent[M];edge edges[M];for(i=1;i<G->vexnum;i++)for(j=i+1;j<=G->vexnum;j++)if(G->arc[i][j].adj==1){edges[k].begin=i;edges[k].end=j;edges[k].weight=G->arc[i][j].weight;k++;}sort(edges,G);for(i=1;i<=G->arcnum;i++)parent[i]=0;printf("最小生成树为:\n");for(i=1;i<=G->arcnum;i++){n=Find(parent,edges[i].begin);m=Find(parent,edges[i].end);if(n!=m){parent[n]=m;k++;printf("(%d,%d) %d\n",edges[i].begin,edges[i].end,edges[i].weight);}if(k==G->vexnum-1) break;}}int Find(int*parent,int f){while(parent[f]>0)f=parent[f];return(f);}void main(){int i,j,m,n;MGraph *G;FILE *fp;G=(MGraph *)malloc(sizeof(MGraph));printf("1:广陵校区2:盐阜校区\n3:瘦西湖校区4:农学院校区\n5:工学院校区6:水利学院校区\n7:医学院校区\n");printf("please input vexnum and edgenum!\n");scanf("%d,%d",&G->vexnum,&G->arcnum);for(i=1;i<=G->vexnum;i++)for(j=1;j<=G->vexnum;j++)G->arc[i][j].adj=G->arc[j][i].adj=0;if((fp=fopen("H:\\shuju.txt","r"))==NULL){printf("can not open file\n");exit(0);}printf("please input n,m,weight:\n");for(i=1;i<=G->arcnum;i++){fscanf(fp,"%d %d",&n,&m);G->arc[n][m].adj=G->arc[m][n].adj=1;fscanf(fp," %d",&G->arc[n][m].weight);printf("%d %d %d\n",n,m,G->arc[n][m].weight);}fclose(fp);MinSpanTree(G);}七、运行结果1.Prim算法:2.Kruskal算法:八、课程设计的小结这一个多星期一直在做程序设计,今天终于完成了,心里别提有多兴奋。