问题总结
1、当使用
正确用法:
#includeusing 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才会输出,即先输出起始景点,依次返回,输出后面的景点,最终形成一条从起点到终点的一条路径。



