《数据结构》课程设计---普里姆算法_最小生成树.doc_第1页
《数据结构》课程设计---普里姆算法_最小生成树.doc_第2页
《数据结构》课程设计---普里姆算法_最小生成树.doc_第3页
《数据结构》课程设计---普里姆算法_最小生成树.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课程设计 管道铺设施工的最佳方案选择 18031944 数据结构课程设计报告蔡金林18031944一设计课题:管道铺设施工的最佳方案选择.n (n10)个居名之间需要铺设煤气管道.假设任意两个居名之间都可以铺设煤气管道,但代价不同.事先将任意两个居名之间铺设煤气管道的代价存入磁盘文件中.设计一个最佳方案使得这n个居名之间铺设煤气管道所需要代价最少,并希望以图形方式在屏幕上输出结果。二算法思想:要在个城市之间铺设煤气管道,则连通个城市只需要条线路而每两个城市之间铺设管道都需要付出一定的经济代价而在个城市之间,最多可能铺设()条管道,要在这些管道中选择条最少耗费的管道线路就可以转化为求最小生成树的问题一个生成数的代价就是树上各边的代价之合构造最小生成树可以有多种算法其中多数算法利用了最小生成树的性质:假设ga(,)是一个连通网,是顶点集的一个非空子集,若(u,v)是一条具有最小权值的边,其中u,v,则必存在一棵包含边(u,v)的最小生成树(证明略)普里姆(prim)算法就是利用这个性质构造最小生成树的算法假设ga=(v,e)是个连通网,是ga上的最小生成树边的集合算法从u0(u0v),te=开始,重复执行下面的操作:在所有的uu,vv-u的边(u,v)e中找一条代价最小的边(u0,v0)并入集合,同时v0并入u,直至u=v为止.此时te中必有n-1条边,则t=(v,te)为ga 上的最小生成树.在本题中根据题目要求首先需要重磁盘文件中读取任意两个居名区之间的铺设管道的代价,即知道了在由居名区构成的连通图中每条边的代价. 利用普里姆算法就可以求出最小生成树.main() 主函数三.程序结构:(1) 流程图 函数关系载入数据 read_data()prim( ) 生成最小边到lge 输出最小边的信息initalgraph () 初始化图形line( )生成点的图形(2) 程序源码#include #include#include /* 需要用到的图形库 */#include#include#define maxvex 12 /*常量的定义*/#define max 1000/* 图的定义*/typedef char vextype;typedef int adjtype;typedef struct adjtype arcsmaxvexmaxvex; int n;graphmatrix;typedef struct int start_vex, stop_vex; /*最小边结构定义*/ adjtype weight;edge;edge lge12; int vex2=150,250,200,170,270,100,350,50,430,100,500,170,550,250,520,330,430,400,350,450,270,400,200,330; /*初始化 个顶点的坐标 */int info1212; char *text;void initalgraph(int vec2) /*画出顶点 函数*/ int gd=detect,gm; int i; initgraph(&gd,&gm,d:turboc2); setlinestyle(0,0,1); settextstyle(0,0,0); setbkcolor(9); for(i=0;i12;i+) circle(veci0,veci1,12);/*画顶点圆*/ sprintf(text,%c,65+i); outtextxy(veci0-1,veci1-1,text); /* 从字母a开始给顶点编号*/ printf(n);void read_data() /*从文件中读入权值数据*/ int i=0,j,q; file *fp; if(fp=fopen(info.txt,r)=null) printf(n this file can not be opened); exit(0); while(!feof(fp) for(j=i+1;j12;j+) fscanf(fp,%d,&infoij); i+; fclose(fp);void prim(graphmatrix * pgraph, edge lge) /*普里姆算法主函数*/ int i, j, min, vx, vy; int weight, minweight; edge edge; for(i=0; in-1; i+) lgei.start_vex=0; lgei.stop_vex=i+1; lgei.weight=pgraph-arcs0i+1; for(i=0; in-1; i+) minweight=max; min=i; for(j=i; jn-1; j+) if(lgej.weightminweight) minweight=lgej.weight; min=j; edge=lgemin; lgemin=lgei; lgei=edge; vx=lgei.stop_vex; for(j=i+1; jn-1; j+) vy=lgej.stop_vex; weight=pgraph-arcsvxvy; if(weightlgej.weight) lgej.weight=weight; lgej.start_vex=vx; void main() int i; int j=0,k; int p,q; int gd=detect,gm; graphmatrix graph; initgraph(&gd,&gm,d:turboc); read_data();/*读入数据*/ initalgraph(vex);/*图形初始化*/ for(j=0;j12;j+) for(k=0;k12;k+) graph.arcsjk=infojk; /*把info数组每边的权值附到图中*/ graph.n=12; prim(&graph,lge);for(i=0;igraph.n-1;i+) printf(%d %d %d)n,lgei.start_vex,lgei.stop_vex,lgei.weight); /* 输出n-1条最小边的信息*/ for(i=0;i12;i+) line(vexlgei.start_vex0,vexlgei.start_vex1,vexlgei.stop_vex0,vexlgei.stop_vex1); /*根据生成的最小边数组连线*/printf(-it is done!-);getch(); exit(1);此程序再turboc2.0环境中编译通过运行.turboc2.0下载的地址/downloads/tc2.rar四收获与体会尽管在大一学c的时候也做图形界面的程序,但是经过很长时间没有去用他,发现自己已经不是很熟悉了.这次的设计我又重新学习了c环境下图形函数的使用.在用普里姆算法做最小生成树的时候在不太理解的情况下又

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论