使用Dijkstra找到最短路径的问题

时间:2018-10-31 23:55:45

标签: c++ shortest-path dijkstra

我正在实现Dijjkstra的算法来查找网络上的最短路径。从源节点s开始,我需要计算到达网络上所有现有节点的最短路径。但是该算法无法正确执行。

这是代码(HEU是图的结构):

int dijkstra(GRAPHD &HEU, int s) {
HEU.d[s] = 0; 
for (int i = 1; i <= HEU.nb_nodes; i++) {
    if (i != s)
        HEU.d[i] = INT_MAX; 
}
for (int i = 1; i <= HEU.nb_nodes; i++) {
    HEU.S[i] = 0; 
    HEU.Q[i] = i; 
}

while (!vazio(HEU)) {
    int u = extract_mimimum(HEU);
    HEU.S[u] = 1;
    retira(HEU, u);
    for (int i = 1; i <= HEU.nb_nodes; i++) {
        if (HEU.qr[u][i] != -1) { //it's just to indicate that the position is not empty
            if (HEU.qr[u][i] != -2) { //it's just to indicate that the position is not empty
                if (HEU.d[HEU.qr[u][i]] > HEU.d[u] + HEU.c[u][HEU.qr[u][i]])
                    HEU.d[HEU.qr[u][i]] = HEU.d[u] + HEU.c[u][HEU.qr[u][i]];
            }
        }
    }
}


return HEU.d;
}

问题是从节点2开始时。 矩阵HEU.c [] []上的所有距离均为1,其图形如下:

HEU.qr[1][1] = 5;

HEU.qr[2][1] = 1;

HEU.qr[2][2] = 3;

HEU.qr[3][1] = 7;

HEU.qr[3][2] = 4;

HEU.qr[4][1] = 8;

HEU.qr[5][1] = 9;

HEU.qr[6][1] = 2;

HEU.qr[6][2] = 5;

HEU.qr[7][1] = 11;

HEU.qr[7][2] = 6;

HEU.qr[8][1] = 7;

HEU.qr[9][1] = 10;

HEU.qr[10][1] = 6;

HEU.qr[10][2] = 11;

HEU.qr[11][1] = 15;

HEU.qr[12][1] = 8;

HEU.qr[13][1] = 9;

HEU.qr[14][1] = 10;

HEU.qr[14][2] = 13;

HEU.qr[15][1] = 14;

HEU.qr[15][2] = 16;

HEU.qr[16][1] = 12;

例如,HEU.qr [16] [1] = 12表示节点16仅具有一个邻居及其节点12。然后,HEU.qr [15] [1] = 14和HEU.qr [15] [2] = 16节点15有两个邻居,分别是14和16。

辅助功能如下:

int vazio(GRAPHD &HEU) {
for (int i = 1; i <= HEU.nb_nodes; i++) {
    if (HEU.Q[i] != 0)
        return 0;
}
return 1;
}

int extract_mimimum(GRAPHD &HEU) {
int min = INT_MAX;
for (int i = 1; i <= HEU.nb_nodes; i++) {
    if (HEU.Q[i] != 0) {
        if (HEU.d[i] < min) {
            min = i;                
        }
    }
}
return min;
}

void retira(GRAPHD &HEU, int a) {
for (int i = 1; i <= HEU.nb_nodes; i++) {
    if (HEU.Q[i] == a) HEU.Q[i] = 0;
}
 }

从节点2开始的距离矢量应为1 0 1 2 2 3 2 3 3 4 4 6 6 5 4 5,但是算法发现1 0 1 2 2 3 2 3 3 4 3 8 8 7 6 7。 有人可以帮我吗?

0 个答案:

没有答案