图上最短距离的求法——逻辑问题 在我的C++课程中,我们已经研究了图表一段时间,而且有一个问题我一直困扰了相当长的一段时间。老师给了我们一个程序,它创建了一个整数图,然后能够在图中找到两个整数之间的最短路径。我们的工作是使其适用于字符串(特别是,找到最短路径,只跳转到与前一个单词有1个不同字母的单词,例如bears->beard)

图上最短距离的求法——逻辑问题 在我的C++课程中,我们已经研究了图表一段时间,而且有一个问题我一直困扰了相当长的一段时间。老师给了我们一个程序,它创建了一个整数图,然后能够在图中找到两个整数之间的最短路径。我们的工作是使其适用于字符串(特别是,找到最短路径,只跳转到与前一个单词有1个不同字母的单词,例如bears->beard),c++,string,graph,C++,String,Graph,以下是我希望我的程序能够完成的示例: Given the list [board, beard, bears, brand, boars, bland, blank] it would create an edge matrix that resembled this: board | beard boars beard | board bears bears | beard boars brand | bland boars | board bears bland | brand bla

以下是我希望我的程序能够完成的示例:

Given the list [board, beard, bears, brand, boars, bland, blank]
it would create an edge matrix that resembled this:

board | beard boars
beard | board bears 
bears | beard boars
brand | bland
boars | board bears 
bland | brand blank
blank | bland

And then if asked to find the distance between board & bears it would output:
board->beard->bears
我修改程序的方式是,它创建一个名为“node”的结构图,其中包含一个数字和一个单词。我使用数字来比较一个向量与其他变量之间的顺序,并使用单词来创建路径。我的改编程序成功地从文本文件中的数据创建了图形,并连接了所有有1个字母差异的单词,然而,当我运行函数查找最短距离时,它绕过了我的边,只需打印出起始单词和结束单词之间的距离为1

我将在下面发布我完整的、可编译的程序,并解释我对这个问题的了解

这里是一个指向两个pastebin链接的链接(我没有足够高的声誉来发布两个以上的链接,所以我必须将它们组合起来)。第一个是我的完整程序,我已经将它调整为使用一组单词,我知道它们之间的单词距离为1,而不是一个文本文件

第二个链接是我老师提供的代码的下载(如果您希望看到程序的工作版本)

我已经把问题缩小到如何填充向量“父母”。不知何故,当程序试图从中检索路径时,它没有正确生成,并且正在产生问题

下面是一张照片的链接(声誉还不足以发布图片),比较了我老师的“健康”计划中的父母向量(查找2和5之间的距离)和我计划中的父母向量:

注意,在我老师的例子中,路径中使用的2和4都是整数,它们出现在父向量中,并被调用来创建它

注意,在我看来,父向量中唯一的单词是起始单词,因此它是唯一可以调用的单词。然而,当比较我的老师填写家长表的方式和我填写家长表的方式时,我看不出有什么不同,除了我的家长是一个字符串,所以我输入的是一个单词而不是一个数字:

(我的改编本在左边,老师的在右边)

如果有更精通图形应用的人能看到这一点并帮助我,我将不胜感激。我已经在这个问题上纠结了一个多星期,老师给我的唯一建议是我应该逐行比较我的程序和他的程序;我做到了,但我仍然找不到问题,我准备放弃

如果你能帮我,非常感谢

特里斯坦

这里:

node * one = createNewNode(1, "board");
...
node * three = createNewNode(3, "bears");
...
insertEdge(&g, one, three);
程序会正确地找到您放在那里的边

更一般地说,您必须学会分步执行代码并查看发生了什么

如果可以的话,不要使用全局变量

编辑:

我有一些空闲时间,所以还有一个问题:

int currNum = start->num;

while (! inTree[currNum])
{
  ...
  parents[edgeNum] = curr->word;
  ...
}
您可以按数字进行迭代,但您可以通过一个从不更新的指针查找内容


我肯定还有其他问题。底线是你没有检查东西。由于某种原因,测试,真正的程序员一直在做的事情,从来没有在编程课程中教过。

哦,哎呀,对不起,当我为这篇文章改编代码时,我一定是把它链接错了,我会把原来的文章改成正确的值;它应该是“insertEdge(&g,一,五)”。我希望我的解决方案能像那样简单,但不幸的是,这个程序仍然不起作用。如果你能看到其他的东西,当然,我会非常感激。
int currNum = start->num;

while (! inTree[currNum])
{
  ...
  parents[edgeNum] = curr->word;
  ...
}