Некорректно работает алгоритм Дейкстры

Код должен работать для взвешенного неориентированного графа, состоящего из 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 шт):

Автор решения: Stanislav Volodarskiy

Переполнение тут:

                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
→ Ссылка