Некорректно работает алгоритм Дейкстры
Код должен работать для взвешенного неориентированного графа, состоящего из n вершин и m ребер. Вершины пронумерованы целыми числами от 1 до n. Необходимо найти длину кратчайшего пути из вершины с номером start в вершину с номером finish. Граф не содержит петель и кратных ребер.
Входные данные: на первой строке количество вершин 1 <= n <= 10^5, 1 <= m <= 10^5, номера вершин start и finish. Далее на m строках первая вершина ребра, вторая и вес ребра(от 0 до 10^9). Например так:
5 6 1 5
1 2 2
1 3 0
3 2 10
4 2 1
3 4 4
4 5 5
На выход должна поступить длина кратчайшего пути или, если вершины не связаны, "No solution".
Мой нерабочий код:
#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
#include<utility>
#define inf 5223372036854775807
using namespace std;
struct Edge
{
int start, fin, len;
};
//алгоритм Дейкстры
vector<long long int> dijkstra(vector<vector<long long int>>& graph, int start, int n) {
vector<long long int> dist(n, inf);
dist[start] = 0;
priority_queue<pair<long long int, int>, vector<pair<long long int, int>>, greater<pair<long long int, int>>> pq; // пара<расстояние до вершины, вершина>
pq.push({ 0, start });
while (!pq.empty()) {
int u = pq.top().second;
pq.pop();
for (int v = 0; v < n; ++v) {
if (graph[u][v] != inf) { // Проверка на недостижимую вершину
int new_dist = dist[u] + graph[u][v];
if (new_dist < dist[v]) {
dist[v] = new_dist;
pq.push({ dist[v], v });
}
}
}
}
// Вывод результата
return dist;
}
int main()
{
int start, finish, n, m;
ifstream fin("input.txt");
//считываем кол-во вершин n и рёбер m, а также start и finish
fin >> n;
fin >> m;
fin >> start;
fin >> finish;
//вектор рёбер
vector<Edge> edges(m);
for (int k = 0; k < m; k++)
{
fin >> edges[k].start >> edges[k].fin >> edges[k].len;
}
//создаём весовую матрицу
vector<vector<long long int> > W(n, vector<long long int>(n, inf));
for (int i = 0; i < n; i++)
{
W[i][i] = 0;
}
for (int i = 0; i < m; i++)
{
W[edges[i].start - 1][edges[i].fin - 1] = edges[i].len;
W[edges[i].fin - 1][edges[i].start - 1] = edges[i].len;
}
vector<long long int> dist = dijkstra(W, start - 1, n);
if (dist[finish - 1] != inf)
{
cout << dist[finish - 1];
}
else
{
cout << "No solution";
}
}
Помогите, пожалуйста, разобраться, в чём заключается ошибка.
Ответы (1 шт):
Переполнение тут:
int new_dist = dist[u] + graph[u][v];
Компилятор - ваш лучший друг:
$ g++ -std=c++17 -pedantic -Wall -Wextra -Werror -Wwrite-strings -Wconversion temp.cpp temp.cpp: In function ‘std::vector<long long int> dijkstra(std::vector<std::vector<long long int> >&, int, int)’: temp.cpp:31:40: error: conversion from ‘__gnu_cxx::__alloc_traits<std::allocator<long long int>, long long int>::value_type’ {aka ‘long long int’} to ‘int’ may change value [-Werror=conversion] 31 | int new_dist = dist[u] + graph[u][v]; cc1plus: all warnings being treated as errors