分枝限界法实验报告.docx
- 文档编号:4436108
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:10
- 大小:152.82KB
分枝限界法实验报告.docx
《分枝限界法实验报告.docx》由会员分享,可在线阅读,更多相关《分枝限界法实验报告.docx(10页珍藏版)》请在冰豆网上搜索。
分枝限界法实验报告
一、课题名称
用分枝限界法求解单源最短路径问题
二、课题内容和要求
设计要求:
学习算法设计中分枝限界法的思想,设计算法解决数据结构中求解单源最短路径问题,编程实现:
(1)给出指定源点的单源最短路径;
(2)说明算法的时间复杂度。
三、需求分析
1.实现极小堆的创建,用来存储活结点表。
2.实现循环队列的创建、初始化、入队、出队等操作。
3.实现分支限界法来实现求解单元最短路径的算法。
4.实现最短路径的正确输出。
四、概要设计
建立工程MinPath.dsw,加入源文件main.cpp,头文件CirQueue.h,init.h,Minpath.h和output.h.CirQueue.h中实现极小堆的创建,循环队列的创建、初始化、入队、出队等操作,Minpath.h中实现分支限界法来实现求解单元最短路径的算法。
output.h中实现最短路径的正确输出。
如下图所示:
实验用例如下,通过邻接矩阵的方式写在init.h中:
五、详细设计
main函数:
#include
#include"init.h"
#include"CirQueue.h"
#include"MinPath.h"
#include"output.h"
voidmain()
{
intk;
intq;
cout<<"------------欢迎使用本系统---------------"< cout<<"------------请选择单元路径的起点: ---------------"< cout<<"------------提示: 输入"<<1<<"到"< cin>>k; cout<<"------------请选择单元路径的终点: ---------------"< cin>>q; while(k<1||k>11) { cout<<"------------提示: 输入"<<1<<"到"< cin>>k; } MinPath(k); output(k,q); } init.h constintsize=200; constintinf=1000;//两点距离上界置为1000 constintn=12;//图顶点个数加1 intprev[n];//图的前驱顶点 intdist[]={0,inf,inf,inf,inf,inf,inf,inf,inf,inf,inf,inf};//最短距离数组 intc[n][n]={{0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,2,3,4,inf,inf,inf,inf,inf,inf,inf}, {0,inf,0,3,inf,7,2,inf,inf,inf,inf,inf}, {0,inf,inf,0,inf,inf,9,2,inf,inf,inf,inf}, {0,inf,inf,inf,0,inf,inf,2,inf,inf,inf,inf}, {0,inf,inf,inf,inf,0,inf,inf,3,3,inf,inf}, {0,inf,inf,inf,inf,inf,0,1,inf,3,inf,inf}, {0,inf,inf,inf,inf,inf,inf,0,inf,5,1,inf}, {0,inf,inf,inf,inf,inf,inf,inf,0,inf,inf,3}, {0,inf,inf,inf,inf,inf,inf,inf,inf,0,inf,2}, {0,inf,inf,inf,inf,inf,inf,inf,inf,2,inf,2}, {0,inf,inf,inf,inf,inf,inf,inf,inf,inf,inf,0},};//图的邻接矩阵 CirQueue.h classMinHeapNode//创建极小堆用来存储活结点表 { public: inti;//顶点编号 intlength;//当前路长 }; classCirQueue//循环队列 { private: intfront,rear;//头指针和尾指针 MinHeapNodedata[size]; public: CirQueue()//初始化建空队列 { front=rear=0; } voidqueryIn(MinHeapNodee)//元素入队操作 { if((rear+1)%size! =front)//队列未满 { rear=(rear+1)%size;//插入新的队尾元素 data[rear]=e;//在队尾插入元素 } } voidqueryOut()//元素出队操作 { if(rear! =front) { front=(front+1)%size;//删除队头元素 } } MinHeapNodegetQuery()//读取队头元素,但不出队 { if(rear! =front) { returndata[(front+1)%size]; } returndata[1]; } boolempty()//判断队列是否为空 { returnfront==rear; } boolfull()//判断队列是否为满 { return(rear+1)%size==front; } };//CirQueue结束 MainPath.h voidMinPath(intv) { CirQueues;//定义源为初始扩展结点 MinHeapNodee; e.i=v; e.length=0; dist[v]=0; s.queryIn(e);//将源节点加入队列 while(true){ for(intj=1;j if(j>=n) { break; } MinHeapNodem=s.getQuery(); if((c[m.i][j] { dist[j]=m.length+c[m.i][j]; prev[j]=m.i; MinHeapNodemi;//加入活结点优先队列 mi.i=j; mi.length=dist[j]; if(s.full()) { break; } s.queryIn(mi);//元素入队 } }//for循环结束 if(s.empty()) { break; } s.queryOut();//当该结点的孩子结点全部入队后,删除该结点 }//while循环结束 }//方法结束 output.h voidoutput(intk,intq) { intq1=q; if(dist[q1]==1000){ cout<<"------------找不到此路径---------------"< return; } cout<<"最短路径长为: "< cout<<"单源最短路径为: "; inta[12]={0}; intt=q1; ints=0; for(inti=0;t! =k;i++) { a[i]=prev[t]; t=prev[t]; s=s+1; } for(i=s-1;i>-1;i--){
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 分枝 限界 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)