21 Востаннє редагувалося koala (28.01.2025 15:27:42)

Re: Обхід графа з обмеженнями

steamwater написав:

У кодi використано auto, ба не auto & (до речi й цей варiант не працює, хоч вiн тут не потрiбен, я вважаю).

Ну я ж кажу - проблема рівня. Ви бачите, що там посилання, але чомусь не можете зрозуміти, в чому проблема. Там має бути

int count = std::get<0, int>(pq.top());

А так, як у вас - виходить, що count має тип const int &, що посилається на верхівку черги... з якої ви робите pop, чим інвалідуєте посилання. Тому що auto може бути і int &, залежно від того, що йому присвоюється (а от навпаки вже ні, int в auto & не запхати). А тепер візьміть за звичку не писати auto ніде, крім випадків, коли ви абсолютно точно певні, що саме там за тип. auto - це не "компілятор розумний, сам здогадається", а переважно для випадків на кшталт

auto ptr = new VeryLongTemplateTypeName<InstanceTypeName>();

тобто коли тип явно вказаний, щоб не повторюватися.

steamwater написав:

покажiть як би ви транслювали

Я старомодний.

struct Vertex {
    int cost, u, stops;
};
...
std::priority_queue<Vertex, std::vector<Vertex>, std::greater<Vertex>> pq;
...
Vertex v = pq.top();
pq.pop();
if(v.u==dst) ...

Якщо потрібні імена - то це вже не tuple.

Подякували: steamwater, leofun012

22 Востаннє редагувалося steamwater (28.01.2025 18:27:18)

Re: Обхід графа з обмеженнями

Дивно що саме цeй випадок ми розбирали у постi ТС про стек... Не виспався мабуть. Пiзно лiг i почалося... Десь о 5-й оголосили відбій. Дякую, зараз добавлю const чи явно типи вкажу i подивлюся, що воно таке.
Я розумiю зараз що провислi посилання призвели до UB, але навiть тодi, у багатьох випадках його не помiтно. У тому й пiдлiсть цього UB. Але його виправлення не призвело до того щоб код працював. Креш у рантаймi такий же ж як був...

#include<tuple>
typedef std::tuple<int,int,int> ti;
class Solution_leet_code_site1 {
public:
    int findCheapestPrice(int n, std::vector<std::vector<int>>& flights, int src, int dst, int K) {
        std::vector<std::vector<std::pair<int,int>>>vp(n);
        for(const auto&f:flights)   vp[f[0]].emplace_back(f[1],f[2]);
        std::priority_queue<ti,std::vector<ti>,std::greater<ti>>pq;
        pq.emplace(0,src,K+1);
        while(!pq.empty()){
           // auto [cost,u,stops] = pq.top();//replaced for C++11 as
            int cost=std::get<0>(pq.top());
            int u=std::get<1>(pq.top());
            int stops=std::get<2>(pq.top());

            pq.pop();
            if(u==dst)  return cost;
            if(!stops)  continue;
            for(auto to:vp[u]){
                //auto [v,w] = to;//replaced for C++11 as
                int v=std::get<0>(to);
                int w=std::get<1>(to);
                pq.emplace(cost+w,v,stops-1);
            }
        }
        return -1;
    }
};

Може ще десь граблi не помiтив?

23 Востаннє редагувалося steamwater (03.02.2025 17:42:27)

Re: Обхід графа з обмеженнями

Перенiс цей клас у первiсному виглядi у MVS19, встановив флаг С++/17. Скомпілювалося. Але той же клятий креш... Якi висновки з приводу цього "складного" алгоритму? Доречi, навiть не знаючи 17, одного погляду на цей алгоритм, вистача щоб збагнути що задачу вiн не виконуватиме. Чи я правий? А от те що воно крешиться i розмiщене у головi рiшень C++ на leetcode, це вже питання iньшого рiвня.