最短路径实验报告
更新时间:2023-07-20 06:20:01 阅读量: 实用文档 文档下载
HUNAN UNIVERSITY
课程实习报告
题 目: 最短路径问题 学生姓名 学生学号 20110801328 专业班级 计算机科学与技术(3)班 完 成 日 期 2013.5.29
一、 需 求 分 析:
1.若用有向网表示某地区的公路交通网,其中顶点表示该地区的
一些主要场所,弧表示已有的公交线路,弧上的权表示票价。试设计
一个交通咨询系统,指导乘客以最少花费从该地区中的某一场所到达
另一场所。
2.本程序要求:
(1)从文件中读取有限网中顶点的数量和顶点间票价的矩阵。
(2)以用户指定的起点和终点,输出从起点到终点的花费。
3.在dos系统下输入起点,并输出最短路径。
4.测试数据:
输入
(文件)
5 -1 10 3 20 -1
-1 -1 -1 5 -1
-1 2 -1 -1 15
-1 -1 -1 -1 11
-1 -1 -1 -1 -1
(用户)
起点 0
终点 4
输出
18
二、 概要设计
为实现上述功能需要用到图的存储结构。
利用邻接矩阵构造图,并求出某一顶点到另一顶点的最短路径并
打印输出。
三、 算法基本思想
根据题目要求用弗洛伊德算法可以实现两点最短路径问题。弗洛
伊德算法仍然使用图的邻接矩阵arcs[n+1][n+1]来存储带权有向图。
算法的基本思想是:设置一个n x n的矩阵A(k),其中除对角线的元素
都等于0外,其它元素a(k)[i][j]表示顶点i到顶点j的路径长度,K
表示运算步骤。开始时,以任意两个顶点之间的有向边的权值作为路
径长度,没有有向边时,路径长度为∞,当K=0时, A (0)[i][j]=arcs[i][j],
以后逐步尝试在原路径中加入其它顶点作为中间顶点,如果增加中间
顶点后,得到的路径比原来的路径长度减少了,则以此新路径代替原
路径,修改矩阵元素。
四、 程序设计流程
程序由三个模块组成:
1.输入模块:起点终点和各点间的权值这都从文件中读取。
2.求最短路径模块:通过弗洛伊德算法求出起点终点最短路径。
3.输出模块:完成弗洛伊德算法后,把最短路径给出,并给出具
体路径。
五、 程序源代码
#include<iostream>
#include<stack>
#include<fstream>
using namespace std;
const int MaxNum=100000;
class Graph
{
private:
int *Adj; //保存邻接矩阵的一维数组 j和k之间权值 存储在
Adj[j*Num+k]中
int Num;//当前顶点数
public:
Graph(); //构造函数
~Graph();//析沟函数
void Dijkstra(int start);//单元最短路径算法
};
Graph::Graph() //构造函数
{
ifstream input("input.txt",ios::in);
if(input==NULL)cout<<"open error!\n";
if(input!=NULL)
{
input>>Num;
Adj=new int[Num*Num];
if(Adj==NULL)exit(0);
for(int i=0;i<Num;i++)
for(int j=0;j<Num;j++)
{
input>>Adj[i*Num+j];
if(Adj[i*Num+j]==-1)
Adj[i*Num+j]=MaxNum;
}
}
}
Graph::~Graph()//析构函数
{
delete []Adj;
}
void Graph::Dijkstra(int start)//单元最短路径算法
{
int*dist=new int[Num];//记录最短权值
int*prev=new int[Num]; //记录路径
int*s=new int[Num];//s为已经确定好的顶点域
int i,j,k,m; //j记录dist的下标
m=start;
for(i=0;i<Num;i++) //初始化
{
dist[i]=Adj[m*Num+i];
prev[i]=m; //记录源点到顶点的最短路径上,本顶点的前一顶点
s[i]=0; //顶点i不在s域中
}
prev[m]=-1; //m是源点 前一顶点不存在
s[m]=1;//源点在s域中
for(i=0;i<Num-1;i++) //差Num-1个顶点需处理
{
int min; //最小权
for(k=0;k<Num;k++) if(!s[k])break; //找到仍在顶点V-S域中的第一个顶点
min=dist[k];
j=k;
for(k=j+1;k<Num;k++) //找最小权值的边
if(!s[k]&&dist[k]<min)
{
min=dist[k];
j=k;
}
s[j]=1; //放进s域中
for(k=0;k<Num;k++) //更新最短路径值
if(!s[k]&&dist[j]+Adj[j*Num+k]<dist[k])
{
dist[k]=dist[j]+Adj[j*Num+k]; //记录最短路径
prev[k]=j; //记录路径 即本顶点k的前驱顶点j }
}
ofstream output("output.txt",ios::out);
if(output==NULL)exit(0);
for(k=0;k<Num;k++) //输出打印
if(k!=m)
{
if(dist[k]>=MaxNum)
{
output<<"源点"<<start<<"到顶点"<<k<<"不存在相通的路径"<<endl<<endl;
}
else
{
output<<"源点"<<start<<"到顶点"<<k<<"的最小花费为:"<<dist[k]<<endl; //输
出最小权值
j=k;
stack<int>Q;
output<<"路径为:";
while(j!=m){Q.push(j);j=prev[j];} //路径存入栈中
Q.push(j);
while(Q.size()!=1){output<<Q.top()<<"-->";Q.pop();} //输出路径
output<<Q.top()<<endl<<endl;Q.pop(); //最后一个元素出栈
}
}
}
int main()
{
Graph G;
cout<<"请输入起点:"<<endl;
int start;
cin>>start;
G.Dijkstra(start);
getchar();
getchar();
return 0;
}
六、 程序输入输出结果
七、 实验心得
这个实验比较难,尤其在求在众多路径中找到那条最短路径。不光要考虑与其相邻下一顶点的最短路径,还要考虑到起到最终要到大的点的所有路径的最小值。 最后解决方法是先找出最小权值的边,然后遍历其他边。再用上一条加上所遍历的边。以求的最短路径。如图:
1到3的最短边是8,但是这不是1到3的最短路径,就要
用1到2,2到3的路径长度相加代替1到3的最短路径。
正在阅读:
最短路径实验报告07-20
屏东县恒春镇垦丁国民小学推动营造『优质英语生活环境』实施计画03-08
态度的例子02-18
集控巡视员(中级)10-15
预算、结算、决算区别01-01
2012年08月民主生活会征求意见、整改措施及落实情况总结08-09
当前农村义务教育政策实施困境与对策分析06-08
快乐的暑假作文450字07-12
南方基金2017校园招聘求职大礼包02-20
数据结构部分习题解答04-02
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 路径
- 实验
- 报告
- 当前职工安全思想状况的调查与分析(最新版)
- 关联业务往来报告表
- 世行贷款项目实施方案
- SMT基本工艺培训-Ricky
- 施工组织设计编制的重点思路郁超
- 中国木薯乙醇燃料的生产概况
- 2015年电大《电大经济数学基础12》期末复习资料及答案
- 小学数学一年级数独初步入门
- 公路安全保护条例试题
- 第十章 健康运动与营养疗法
- 【呕心沥血整理】2014年造价工程师考试 工程造价案例分析 考前老师划重点
- 11-1常数项级数的基本概念和性质
- 关于诺基亚手机的市场调查问卷模板
- Pix4d Mapper Pix4dMapper (Pix4UAV的升级版)城市规划与重建
- 对高职院校二级财务管理的思考
- 100以内的加法和减法(一)——解决问题教学目标
- 变频器的电位器控制(杨力)
- 血清TT3、FT3、TT4、FT4以及TSH检测意义
- 幼儿园小班教师随笔
- 湘教版初中美术教案7年级下册:第5课 远古的呼唤