Dijkstra最短路径算法错误

时间:2018-05-19 20:50:51

标签: c++ algorithm dijkstra

我编写了以下代码来实现Dijkstra的最短路径算法:

#include <iostream>
#include <queue>
#include <utility>
#include <vector>
#include <functional>
#include <list>
#include <cstring>

int findPath(std::vector<std::list<std::pair<int, int>>> graph, int x, int y) {
    int n = graph.size();
    std::priority_queue < std::pair<int, int>, std::vector<std::pair<int, int>>, std::greater<std::pair<int, int>>> pq;
    pq.push(std::pair<int, int>(0, x));
    int *visited = new int[n + 1]{};
    int *distance = new int[n + 1];
    memset(distance, -1, sizeof(*distance) * (n + 1));
    distance[x] = 0;

    int current;
    while (!pq.empty()) {
        current = pq.top().second;
        pq.pop();
        if (current == y) {
            return distance[y];
        }
        if (!visited[current]) {
            visited[current] = 1;
            for (std::list<std::pair<int, int>>::iterator it = graph[current].begin(); it != graph[current].end(); it++) {
                if (!visited[it->first]) {
                    if (distance[it->first] == -1 || distance[it->first] > distance[current] + it->second) {
                        distance[it->first] = distance[current] + it->second;
                        pq.push(std::pair<int, int>(distance[it->first], it->first));
                    }
                }
            }
        }
    }
    return distance[y];
}

int main()
{
    std::ios::sync_with_stdio(false);

    int n;
    int m;
    int x;
    int y;

    std::cin >> n >> m >> x >> y;

    int a;
    int b;
    int c;

    std::vector<std::list<std::pair<int, int>>> graph(n + 1);

    for (int i = 0; i < m; ++i) {
        std::cin >> a >> b >> c;
        graph[a].push_back(std::pair<int, int>(b, c));
    }

    std::cout << findPath(graph, x, y) << std::endl;

    return 0;
}

输入是N - 顶点数,M - 边数,x,y - 2顶点。 然后你有M行的a,b,c,这意味着你有一条从a到b的路径,距离为c。

此外,您可以从一个顶点到另一个顶点有多条边。

目标是找到从x到y的最短路径。 (如果没有路径,则为-1) 我正在使用对的优先级队列(第一个是到顶点的当前距离,第二个是顶点)。

代码适用于某些测试,并为其余测试提供了错误的答案(来自判断系统,所以我看不出测试是什么)。

我看了一个小时,我似乎无法找到它为什么不起作用。

如果你能找到错误,我将不胜感激,为什么它不起作用。

示例输入:

5 5 1 5

1 2 1

1 3 2

2 4 4

3 4 4

4 5 5

输出: 10

编辑:代码中似乎没有错误。如果有从a到b的路径,那么任务就是模糊的,从b到a有一个路径。那就是错误。

0 个答案:

没有答案