我编写了以下代码来实现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有一个路径。那就是错误。