版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1课课 程程 实实 验验 报报 告告 课程名称:课程名称: 算法设计与分析算法设计与分析 专业班级:专业班级:计算机科学与技术计算机科学与技术 13xx13xx 班班学学 号:号: 姓姓 名:名: 指导老师:指导老师: 报告日期:报告日期: 2021-11-292021-11-29 计算机科学与技术学院计算机科学与技术学院2目录目录一实验一一实验一.31 1实验题目实验题目.32 2设计思路设计思路.33 3程序源代码程序源代码.44 4运行演示运行演示.7二实验二二实验二.81 1实验题目实验题目.82 2设计思路设计思路.83 3程序源代码程序源代码.94 4运行演示运行演示.123一实验
2、一实验一一1 1实验题目实验题目单源最短路径问题: 一个 n 结点有向图 G=(V,E)和边的权函数 c(e),求由 G 中某指定结点 v0到其它各结点的最短路径。假定边的权值为正。2 2设计思路设计思路 贪心算法流程图如图 1:图 1 生成最短路径算法流程设计总方法:使用贪心算法求解。贪心方法:1) 度量标准生成的所有路径长度之和作为度量标准。为了使这一量度到达最小,其单4独的每一条路径都必须具有最小长度。2) 算法按照路径长度的非降次序生成这些路径。首先,生成一条到最近结点的最短路径,然后,生成一条到第二近结点的最短路径,等等。即只用求出从路径 v0开始到 G 中其他所有结点的最短路径长度
3、。假定 G中 n 个结点被标记上 1 到 n,集合 S 作为一个数组存放,如果结点 i 不在 S 中,那么 Si=0,如果在 S 中,那么 Si=1,假设 COSTi,j是i,j的权,那么在边i,j不在本钱邻接矩阵时,就被置某个大数,这里用 N 表示,当 i=j 时,COSTi,j被置以 0。3 3程序源代码程序源代码#include #include #define N 1000void shortestPaths(int v,int *COST,int *DIST,int n);/最短路径生成函数void output2(int *arr,int row,int col);/输出本钱的邻接
4、矩阵void outArray1(int *arr,int n);/输出更新后其它结点到起始结点的路径长度int main() int COST77= 0,20,50,30, N, N, N, N, 0,25, N, N,70, N, N, N, 0,40,25,50, N, N, N, N, 0,55, N, N, N, N, N, N, 0,10,70, N, N, N, N, N, 0,50, N, N, N, N, N, N, 0 ; int DIST7; int v=0; /* printf(本钱邻接矩阵:n); output2(&COST00,7,7); */ /生成 0 号结点到
5、 1 至 6 号结点的最短路径 shortestPaths(v,&COST00,DIST,7); return 0;void shortestPaths(int v,int *COST,int *DIST,int n)/G 是一个 n 结点有向图,它由其本钱邻接矩阵 COSTnn表示,DISTj被置以结点 v 到 /结点 j 的最短路径长度,这里 1=j=n;DISTv被置成 0 int Sn;5 int pren;/pw记录起始结点到结点 w 的最短路径中的 w 前一结点 int u,num,i,w; int tv,td=0; /初始化:结点 v 以外的结点未被选中,并更新路径长度为 v 到
6、其它结点的初始本钱 for(i=0;in;i+) Si=0; *(DIST+i)=*(COST+v*n+i); prei=0; Sv=1; DISTv=0; /更新路径长度 for(num=1;numn;num+) /选择距离结点 v 最近的结点 w for(w=1;wn;w+) if(Sw=0) td=DISTw; tv=w; break; for(w+;wDISTw) td=DISTw; tv=w; u=tv; Su=1; DISTu=td; /更新路径 for(w=1;w(DISTu+*(COST+u*n+w)6 DISTw=(DISTu+*(COST+u*n+w); prew=u;/更
7、新结点 w 最短路径并记录 w 结点的上一结点 /输出第 num 次更新后的路径长度 printf(n 第%d 次路径:,num); output1(DIST,n); printf(nn); /输出路径 for(i=1;in;i+) printf(从 0 到%d,最短的路径是:n,i); w=i; printf(%d-,w); while(prew!=v) w=prew; printf(%d-,w); printf(%dn,v); void output2(int *a,int row,int col) int i,j; for(i=0;irow;i+) for(j=0;jcol;j+) if
8、(*(a+i*row)+j)=N) printf( Nt); else printf(%3dt,*(a+i*row)+j); puts(n); void output1(int *arr,int n) int i; for(i=0;in;i+)7 if(*(arr+i)=N) printf( Nt); else printf(%3dt,*(arr+i); 4 4运行演示运行演示我用了书上的一个例子,它的本钱邻接矩阵已直接存入程序中,它的带权有向图如下:V0V1V2V3V5V6V4207025503040555025105070 图 2 带权有向图运行结果如下所示:8图 3 运行结果图二实验二二
9、实验二1 1实验题目实验题目k 路归并:每次同时归并 k 个文件且使移动次数最少。2 2设计思路设计思路1、流程图总流程图如图 1 所示。9图 1 归并文件流程图2、设计方法贪心算法3、度量标准每次选出 k 个最小的文件归并,将归并后的结果作为新的文件参加待归并的文件序列中,直到归并完成。值得注意的是,由于所有的内部点的度数必须为 k,因此,对于 n 取某些值,就不和 k 元归并树相对应。所以有必要引进一定量的虚结点,每个虚结点赋值 0,这个虚结点的虚值,不会影响所产生度数为 k 的带权外部路径长度。3 3程序源代码程序源代码#include#include10#include#include
10、#define MAX 100typedef int ElemType;typedef struct Table ElemType elem; struct Table *next;T;void outTable(T *head);void func(T *head,int k);int main() int num,k,r; T *head,*cur; head=(T *)malloc(sizeof(T); head-elem=0; /获取文件数 do printf(请输入文件的个数(1):); scanf(%d,&num); while(num1,=%d):,num); scanf(%d,
11、&k); while(knum); /生成随机序列 srand(time(NULL); cur=(T *)malloc(sizeof(T); head-next=cur; head-elem+; cur-elem=(rand()%MAX+1); while(head-elemnext=(T *)malloc(sizeof(T); cur=cur-next; cur-elem=(rand()%MAX+1); head-elem+; printf(随机生成的文件序列为:);11 outTable(head); /补充虚结点 r=(k-1)-(num-1)%(k-1)%(k-1); while(he
12、ad-elemelem=0; cur-next=head-next; head-next=cur; head-elem+; if(r=0) printf(不用补充虚结点n); else printf(补充%d 个虚结点:,r); outTable(head); /归并 func(head,k); return 0;void func(T *head,int k) T *mink,*mpre,*cur,*cpre; int i=0,j=1,times=(head-elem-1)/(k-1),t=times; while(times-0)/当 K 小于等于待归并文件数时,取 K 个最小的文件归并
13、if(kelem) i=-1; /取 k 个最小的文件 while(+inext; j=0; while(jelem) if(mini-elemcur-elem) mpre=cpre; mini=cur; 12 cpre=cur; cur=cur-next; j+; mpre-next=mini-next; head-elem-; /输出归并的 K 个文件的大小 printf(第%d 次归并:,t-times); i=0; while(ielem); i+; i=1; /归并 K 个文件 while(ielem+=mini-elem; free(minj); i+; /将归并 K 个文件得到的新文件参加节点中 min0-next=head-next; head-next=min0; head-elem+; /输出归并后的文件 printf(t 归并后的文件为:); cur=head-next; i=head-elem; while(i-0) printf(%4d,cur-elem); cur=cur-next; printf(n); void outTable(T *he
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 焦作市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)含答案详解(典型题)
- 巫山县农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)附答案详解(模拟题)
- 广安市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)及完整答案详解1套
- 韶关市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)含答案详解(夺分金卷)
- 延庆县农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)完整答案详解
- 2026年六安市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)含答案详解(夺分金卷)
- 开封市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)含答案详解(预热题)
- 湛江市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)附答案详解(巩固)
- 黄南州农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)及参考答案详解1套
- 2025年特种作业人员考试(煤矿瓦斯检查作业)仿真试题及答案
- 2025下半年四川成都东部新区教育卫健和文旅体局教育系统所属事业单位考试招聘31人考试参考试题及答案解析
- 工业皮带专业知识培训课件
- 新生儿患者安全知识培训课件
- 2025至2030全球及中国便携式风扇行业发展趋势分析与未来投资战略咨询研究报告
- 2025年救护车司机驾驶员资格考试考前真题训练题库及答案
- 公路工程重大风险安全管控方案
- 《市场监管部门标识规范》编制说明
- 学校工作汇报会议
- 2025广东深圳市福田区选用劳务派遣人员308人笔试历年参考题库附带答案详解
- 纪委编外考试试题及答案
- 江苏定向考试题目及答案
评论
0/150
提交评论