这是用于Dijkstra算法的一小段代码。我正在尝试创建一个数组(first_edge),它将告诉我E中每个“源”节点的起始索引,它是一个名为“Edge”的结构数组,它包含源节点的id#,目标节点的id#,以及两者之间的距离。
这只是为了更快地找到从给定源节点引出的所有边缘。
我在for循环中构建的测试语句打印出来的确是我所期望的,基于输入,但是第二个循环,(for(j = 0; j< 15; j ++){code}打印出我的前15个值都只是0。
我无法想象任何可能导致我的代码在同一问题上给出两个不同答案的东西,但这就是它似乎正在做的事情。
int* first_edge = new int[23947350];
first_edge[0] = 0;
for(j = 1; j < 58333344; j++) {
if(E[j].src > E[j-1].src) {
if(j < 15) {
//this line prints what i expect it too, which is good
cout << "First edge updated " << j << " " << E[j].src << endl;
}
first_edge[E[j].src] = j;
if(j < 15) {
cout << "first edge now " << first_edge[E[j].src] << endl;
cout << "Oh and the index is " << E[j].src << endl;
} // end if
} // end if
} // end for
for(j = 0; j < 15; j++) {
// earlier prints verify the correct contents of first_edge, surely this will work!
cout << " " << first_edge[j] << " " << j << endl;
}
一些输出。我冒昧地把它变得不那么罗嗦,只是给出了我给予的价值。
((j = 3; E[j].src = 1; first_edge[E[j].src] = 3))
((j = 5; E[j].src = 2; first_edge[E[j].src] = 5))
((j = 8; E[j].src = 3; first_edge[E[j].src] = 8))
由于对我关注的有效性存在一些疑问,我将first_edge [1]硬编码到较早的循环中,并且证明是3.在后面的for循环中,first_edge的0到14之间的所有值都打印为0
答案 0 :(得分:0)
假设j = 7。
在第一个循环中,然后打印7,接着是E [7] .src。
然后,在更新first_edge [E [7] .src]之后,该输出后跟first_edge [E [7] .src]和E [7] .src。
在最后一个循环中,您打印first_edge [7],然后是7。
你有什么理由期望所有这些都打印出来吗?
我看不到它。
答案 1 :(得分:0)
在不知道边缘结构如何与j
相关的情况下,无法将E[j].src
与j
相关联。因此E[j].src
可能不等于j
。
因此,first_edge[E[0].src]
到first_edge[E[14].src]
可能不一定是first_edge
,first_edge[0]
到first_edge[14]
的前15个。