栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

校园导游系统(C++)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

校园导游系统(C++)

问题总结

1、当使用时,该头文件没有定义全局命名空间,必须使用using namespace std,这样才能使用类似于cout这样的C++标识符

正确用法:

#include
using namespace std;

2、对称赋值(注意细节)

for(i=1;i<=c.vexnum;i++)
    for(j=1;j<=c.vexnum;j++)
        c.arcs[j][i]=c.arcs[i][j];//之前把该语句左右写反,输出全部错误 

3、C++使用string 要引用 #include

注意string第一个字母是小写

4、使用迪杰特斯拉算法出现的问题

只设置与起始节点v0有弧时前驱设置为v0,否则为-1,而忘记设置起始节点的前驱为-1。以至于在利用每个结点的前驱输出路径的时候,直到找到前驱结点为-1的循环结束条件不存在,一直进入死循环。

//初始化
	for(i=1;i<=n;i++)
	{
		S[i]=false;
		D[i]=G.arcs[v0][i];//将当前的最短路径初始化为权值 
		if(D[i] 

所以初始化很重要,算法没有问题而是赋值的时候一开始就出了问题。

5、使用弗洛伊德算法出现的问题

初始化要把两个结点之间没有弧的权值置为最大值,i=j 的结点权值置为0(表示从结点到结点自己本身距离为0).我最开始将与第一个结点有弧权值赋给数组,没有弧的均赋值最大,即i=j 的结点权值也初始化为最大值。这导致

for(k=1;k<=n;k++) //要插入的k 
		for(i=1;i<=n;i++)
			for(j=1;j<=n;j++)
				if(D[i][k]+D[k][j] 

插入一个结点之后,判断距离是否比不加节点后的路径小的时候,如果i=j,因为赋值为最大值,所以D[i][j]>D[i][k]+D[k][j],会把j的前驱改变。这与我们想要的结果是不一致的,正确结果应该是它的前驱保持-1不变。因为赋值错误,后面的借助前驱输出路径也会发生错误。

6、使用while循环输出路径,而不是递归(输出的路径是逆向的)

使用while循环输出路径会首先输入终点的前一个景点,依次输出前一个结点,最终结果是从终点到起点的一条路径。

若使用递归,直到找到前驱结点为-1才会输出,即先输出起始景点,依次返回,输出后面的景点,最终形成一条从起点到终点的一条路径。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/676108.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号