<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Forum Pasja Informatyki - Najnowsze z tagiem dijkstra</title>
<link>https://forum.pasja-informatyki.pl/tag/dijkstra</link>
<description>Powered by Question2Answer</description>
<item>
<title>Ścieżka o największym koszcie w grafie ważonym</title>
<link>https://forum.pasja-informatyki.pl/581565/sciezka-o-najwiekszym-koszcie-w-grafie-wazonym</link>
<description>Mam wydaje mi się, że ciekawy problem. Dużo uczy się algorytmów do najkrótszych / o najmniejszym koszcie scieżek, np BFS czy Dijkstra. Ale ostatnio zainteresowałem się najdłuższymi scieżkami, problem, gdzie krawędzie mają wagi jeden, i trzeba znaleźć najdłuższą scieżkę w takim grafie, już sobie z nim poradziłem: dzielę graf na SCC, wrzucam na kolejkę, z których nie wychodzą już żadne, mam licznik ile wychodzi krawędzi z każdego wierzchołka, i jak przetwarzam wierzchołek to idę po wszystkich krawędziech, którego do niego idą, i odejmuję jeden. I tak w kółko jak nic nie wychodzi to wrzucam na kolejkę, aktualizuje ile wchodzi..... - dynamik. Chodzi mi o to co jest w tym zadaniu: &lt;a href=&quot;https://atcoder.jp/contests/dp/tasks/dp_g&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://atcoder.jp/contests/dp/tasks/dp_g&lt;/a&gt; , tylko w tym zadaniu nie trzeba dzielić na SCC, bo nie ma cykli.&lt;br /&gt;
&lt;br /&gt;
Zastanawiam się jak znaleźć ścieżkę o największym koszcie, intuicyjne wydaje się, żeby zrobić Dijkstrę, tylko zamiast od najmniejszych iść do największych, tylko nie wiem czy to jest dobre. Bo teorytycznie wydaje mi się, że na podobnej zasadzie jak w algorytmie Dijkstry, będziemy mieć pewność, że jest to ścieżka o największym koszcie. Więc mam pytania:&lt;br /&gt;
&lt;br /&gt;
1- czy to jest dobre&lt;br /&gt;
&lt;br /&gt;
2 - Czy da się to zrobić w złożonności szybszej niż Dijkstra?&lt;br /&gt;
&lt;br /&gt;
Z góry dziękuję za pomoc i poświęcony czas!&lt;br /&gt;
&lt;br /&gt;
edit: oczywiście zakładam, że po każdej krawędzi można przejść maksymalnie raz, bo tak to byśmy sobie w kółko chodzili i zrobili koszt nieskończoność.&lt;br /&gt;
&lt;br /&gt;
3 - czy algorytmy najdłuższch / o największym koszcie pojawiają się w zadaniach?, bo ja np. jeszcze nigdy się z czymś takim nie spotkałem, oprócz tego z Atcodera.</description>
<category>Algorytmy</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/581565/sciezka-o-najwiekszym-koszcie-w-grafie-wazonym</guid>
<pubDate>Mon, 06 Mar 2023 09:28:29 +0000</pubDate>
</item>
<item>
<title>Jaką ten algorytm ma złożonność?, Zadanie Zawody 1 etap OI, Algorytm Dijkstry</title>
<link>https://forum.pasja-informatyki.pl/579911/jaka-ten-algorytm-ma-zlozonnosc-zadanie-zawody-1-etap-oi-algorytm-dijkstry</link>
<description>

&lt;p&gt;Natknąłem się na zadanie Zawody z 1 etapu XI OI:&amp;nbsp;&lt;a href=&quot;https://szkopul.edu.pl/problemset/problem/UiDG8sd_wsS2RfUPL3zQQ1XW/site/?key=statement&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://szkopul.edu.pl/problemset/problem/UiDG8sd_wsS2RfUPL3zQQ1XW/site/?key=statement&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;Napisałem algorytm, który wydaje mi się, że działa w O(N^2 * lg(N) ), odpalam Dijkstrę z każdego wierzchołka x, do którego wychodzi krawędź z wierzchołka 1 -&amp;gt; x (wierzchołek 1 to wejściowy). Kod wchodził na 70pkt, ale po dodaniu linii 57 i 58(żeby nie iśc niepotrzebnie tą Dijkstrą, jak wynik i tak będzie większy) daje 100pkt z bardzo dużym zapasem. Myślałem, że to poprostu przyśpieszy, ale myślałem, że nie wejdzie na 100, bo dalej jest O(N^2 * lg(N)). Więc zastanawiam się, czy złożonność się amortyzuje do lepszej złożonności, czy poprostu dlatego, że jest tylko 10 testów właściwych + 5 przykładowych(W wszystkich się szybko kończy)? W ksiażce &quot;Przygody&amp;nbsp;Bajtazara 25 lat Olimpiady Informatycznej&quot; jest opisane rozwiązanie O((N+M) * lg(N)), którego jeszcze nie rozumiem, ale tez używają tam Dijkstry.&amp;nbsp;Poglądowy rysunek mojego rozwiązania, jakbym źle opisał. Na czerwono zaznaczone wierzchołki, z których puszczam Dijkstrę(osobno), na zielono jakieś przykładowe wierzchołki z krawędziami(gdzie zwroty to wierzchołki), a wierzchołek &quot;wejsciowy&quot;, ma numer 1.&lt;/p&gt;



&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;https://forum.pasja-informatyki.pl/?qa=blob&amp;amp;qa_blobid=5193156014700438028&quot; style=&quot;height:337px; width:600px&quot;&gt;&lt;/p&gt;



&lt;p&gt;Kod:&lt;/p&gt;



&lt;pre class=&quot;brush:cpp;&quot;&gt;
#include &amp;lt;iostream&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;set&amp;gt;

using namespace std;

struct Krawedz
{
    int do_kogo;
    int waga;
};

struct Element_seta
{
    int wierzcholek;
    int wartosc;
    bool operator &amp;lt; (const Element_seta &amp;amp;element_seta) const
    {
        if (wartosc == element_seta.wartosc)
            return wierzcholek &amp;lt; element_seta.wierzcholek;
        return wartosc &amp;lt; element_seta.wartosc;
    }
};

int n = 0, m = 0, a = 0, b = 0, c = 0, d = 0, wyn = 0, min_wyn = 1e9+20;
vector&amp;lt;vector&amp;lt;Krawedz&amp;gt;&amp;gt; krawedzie;
vector&amp;lt;int&amp;gt; dp;
set&amp;lt;Element_seta&amp;gt; S;

int main()
{
    // O(N^2 * lg(N))???
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    cin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; m;
    krawedzie.assign(n+1,{});
    dp.assign(n+1,-1);
    for (int i = 0; i &amp;lt; m; ++i)
    {
        cin &amp;gt;&amp;gt; a &amp;gt;&amp;gt; b &amp;gt;&amp;gt; c &amp;gt;&amp;gt; d;
        krawedzie[a].push_back({b,c});
        krawedzie[b].push_back({a,d});
    }

    for (int i = 0; i &amp;lt; krawedzie[1].size(); ++i)
    {
        fill(dp.begin(),dp.end(),-1);
        S.clear();
        dp[krawedzie[1][i].do_kogo] = krawedzie[1][i].waga;
        S.insert({krawedzie[1][i].do_kogo,krawedzie[1][i].waga});
        wyn = -1;
        while(!S.empty())
        {
            Element_seta spr = *S.begin();
            if (spr.wartosc &amp;gt; min_wyn)
                break;
            S.erase(spr);
            if (spr.wierzcholek == 1)
            {
                wyn = spr.wartosc;
                break;
            }
            for (int j = 0; j &amp;lt; krawedzie[spr.wierzcholek].size(); ++j)
            {
                int v = krawedzie[spr.wierzcholek][j].do_kogo;
                if (v == 1 &amp;amp;&amp;amp; spr.wierzcholek == krawedzie[1][i].do_kogo)
                    continue;
                if (dp[v] == -1 || spr.wartosc + krawedzie[spr.wierzcholek][j].waga &amp;lt; dp[v])
                {
                    auto it = S.find({v,dp[v]});
                    if (it != S.end())
                        S.erase(*it);
                    dp[v] = spr.wartosc + krawedzie[spr.wierzcholek][j].waga;
                    S.insert({v,spr.wartosc + krawedzie[spr.wierzcholek][j].waga});
                }
            }
        }
        if (wyn != -1)
            min_wyn = min(min_wyn,wyn);
    }

    cout &amp;lt;&amp;lt; min_wyn &amp;lt;&amp;lt; '\n';

    return 0;
}
&lt;/pre&gt;



&lt;p&gt;Z góry dziękuję za pomoc i poświęcony czas!&lt;/p&gt;</description>
<category>Algorytmy</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/579911/jaka-ten-algorytm-ma-zlozonnosc-zadanie-zawody-1-etap-oi-algorytm-dijkstry</guid>
<pubDate>Sun, 12 Feb 2023 15:29:36 +0000</pubDate>
</item>
<item>
<title>Modyfikacja algorytmu Dijkstry</title>
<link>https://forum.pasja-informatyki.pl/578203/modyfikacja-algorytmu-dijkstry</link>
<description>

&lt;p&gt;Siemka ponownie, tym razem mam kłopot z zadaniem &lt;a href=&quot;https://szkopul.edu.pl/problemset/problem/l8-ujU0a7HQFxy8UY32B4Kk_/site/?key=statement&quot; rel=&quot;nofollow&quot;&gt;Przemytnicy&lt;/a&gt;&amp;nbsp;z X OI, I etap. Od razu zauważyłem, że w tym zadaniu trzeba wykorzystać algorytm Dijkstry. Oto moje spostrzeżenia nt. tego zadania:&lt;/p&gt;



&lt;p&gt;Zauważyłem, że można oprócz tablicy dis[x], (która przechowuje min. odległość od wierzchołka 1. do x) zrobić tablicę disTo1[x], która przechowywać będzie min. odległość z wierzchołka x do 1 (o ile istnieje).&lt;/p&gt;



&lt;p&gt;Tutaj załączam tabelkę, która zwizualizuje wam ten problem i zadanie stanie się proste do zrozumienia:&amp;nbsp;&lt;a href=&quot;https://imgur.com/a/bQkWwql&quot; rel=&quot;nofollow&quot;&gt;link&lt;/a&gt;. Suma &lt;em&gt;&lt;strong&gt;sum&lt;/strong&gt;&lt;/em&gt; jest równa sumie dis[x], disTo1[x] oraz połowy val[x], gdyż cło wynosi połowę przewożonego ładunku.&lt;/p&gt;



&lt;p&gt;Jedyny problem dla mnie to jakiś wydajny sposób na stworzenie tablicy disTo1[x]. Ma ktoś pomysł i zechciałby się nim podzielić? I jak to zrobić tak, aby nie lecieć n (gdzie n to liczba wierzchołków) razy algorytmem Dijkstry?&lt;/p&gt;



&lt;p&gt;Jak do tej pory napisałem tyle:&lt;/p&gt;



&lt;p&gt;[&lt;a href=&quot;https://ideone.com/4sq4mN&quot; rel=&quot;nofollow&quot;&gt;on-line&lt;/a&gt;]&lt;/p&gt;



&lt;pre class=&quot;brush:cpp;&quot;&gt;
#include &amp;lt;bits/stdc++.h&amp;gt;

#define x first
#define y second

using namespace std;

vector &amp;lt;pair &amp;lt;int, int&amp;gt;&amp;gt; v[5001];
priority_queue &amp;lt;pair &amp;lt;int, int&amp;gt;&amp;gt; q;
int dis[5001], disTo1[5001], val[5001], sum[5001];
bool vis[5001];
const int INF = 1e9 + 1;
int n;

void dij(int w) {
&amp;nbsp;&amp;nbsp; &amp;nbsp;for (int i = 2; i &amp;lt;= n; i ++)
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;dis[i] = INF;
&amp;nbsp;&amp;nbsp; &amp;nbsp;dis[1] = 0;

&amp;nbsp;&amp;nbsp; &amp;nbsp;q.push({0, w});
&amp;nbsp;&amp;nbsp; &amp;nbsp;while (!q.empty()) {
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;w = q.top().y;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;q.pop();

&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (vis[w])
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;continue;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;vis[w] = 1;

&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;for (auto a : v[w]) {
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;dis[a.x] = min(dis[a.x], dis[w] + a.y);
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (!vis[a.x])
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;q.push({-dis[a.x], a.x});
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}
&amp;nbsp;&amp;nbsp; &amp;nbsp;}
}

int main() {
&amp;nbsp;&amp;nbsp; &amp;nbsp;cin &amp;gt;&amp;gt; n;
&amp;nbsp;&amp;nbsp; &amp;nbsp;for (int i = 1; i &amp;lt;= n; i ++)
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;cin &amp;gt;&amp;gt; val[i];

&amp;nbsp;&amp;nbsp; &amp;nbsp;int k;
&amp;nbsp;&amp;nbsp; &amp;nbsp;cin &amp;gt;&amp;gt; k;
&amp;nbsp;&amp;nbsp; &amp;nbsp;while (k --) {
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;int a, b, c;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;cin &amp;gt;&amp;gt; a &amp;gt;&amp;gt; b &amp;gt;&amp;gt; c;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;v[a].push_back({b, c});
&amp;nbsp;&amp;nbsp; &amp;nbsp;}

&amp;nbsp;&amp;nbsp; &amp;nbsp;dij(1);

&amp;nbsp;&amp;nbsp; &amp;nbsp;/* for (int i = 1; i &amp;lt;= n; i ++)
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;cout &amp;lt;&amp;lt; i &amp;lt;&amp;lt; ' ' &amp;lt;&amp;lt; dis[i] &amp;lt;&amp;lt; '\n'; */
}
&lt;/pre&gt;</description>
<category>C i C++</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/578203/modyfikacja-algorytmu-dijkstry</guid>
<pubDate>Mon, 16 Jan 2023 21:28:12 +0000</pubDate>
</item>
<item>
<title>Zadanie Bitocja - Algorytm Dijkstry.</title>
<link>https://forum.pasja-informatyki.pl/568320/zadanie-bitocja-algorytm-dijkstry</link>
<description>

&lt;p&gt;Cześć,&lt;/p&gt;



&lt;p&gt;Ostatnio natknąłem się na zadanie z 3 etapu 1 edycji OIG -&amp;nbsp;&lt;a href=&quot;https://szkopul.edu.pl/problemset/problem/HP0-iQt7v7vElza8XxoucKto/site/?key=statement&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://szkopul.edu.pl/problemset/problem/HP0-iQt7v7vElza8XxoucKto/site/?key=statement&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;Wydaje mi się, że mam dobry pomysł a mianowicie: Robię algorytm Dijkstry najpierw dla danych krawędzi które mamy i ustalam min wynik, potem dodaję cały czas kolejną krawędź i sprawdzam znowu algorytmem Dijkstry czy wynik się nie poprawił jak tak to wypisuję 1 w przeciwnym razie 0.&lt;/p&gt;



&lt;p&gt;Dostaję jednak tylko 20 pkt (19 testów łącznie - 7 dobrze,5 zle odpowiedzi, 7 przekroczono limit czasu). Pewnie dlatego, że mam jakiś błąd w algorytmie Dijkstry. (Pierwszy raz piszę ten algorytm) Nie mogę znaleźć błędu. Wyczytałem w internecie, że najszybsza wersja tego algorytmu to na kolejce priorytetowej, więc set też powinien być ok. Jak ktoś by znajdzie błąd to jestem bardzo wdzięczny. Kod:&amp;nbsp;&lt;/p&gt;



&lt;pre class=&quot;brush:plain;&quot;&gt;
#include &amp;lt;iostream&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;set&amp;gt;

using namespace std;

struct Wierzcholek
{
    long long cena;
    long long numer_wierzcholka;

    bool operator &amp;lt; (const Wierzcholek&amp;amp;wierzcholek) const
    {
        if (cena != wierzcholek.cena)
        {
            return cena &amp;lt; wierzcholek.cena;
        }
        return numer_wierzcholka &amp;gt; wierzcholek.numer_wierzcholka;
    }

    bool operator == (const Wierzcholek&amp;amp;wierzcholek) const
    {
        return numer_wierzcholka == wierzcholek.numer_wierzcholka;
    }
};

struct Krawedz
{
    long long cena;
    long long do_kod;
};

vector&amp;lt;vector&amp;lt;Krawedz&amp;gt;&amp;gt; krawedzie;

long long dijkstra(int n)
{
    set &amp;lt;Wierzcholek&amp;gt; Q;
    vector&amp;lt;bool&amp;gt; czy_odwiedzony;
    for (int i = 0 ; i &amp;lt;= n; ++i)
    {
        czy_odwiedzony.push_back(false);
    }
    Q.insert({0,1});
    while (!Q.empty())
    {
        Wierzcholek sprawdzany;
        for (auto c : Q)
        {
            sprawdzany = c;
            break;
        }

        if (sprawdzany.numer_wierzcholka == n)
        {
            return sprawdzany.cena;
        }
        czy_odwiedzony[sprawdzany.numer_wierzcholka] = true;

        for (int i = 0; i &amp;lt; krawedzie[sprawdzany.numer_wierzcholka].size(); ++i)
        {
            if (czy_odwiedzony[krawedzie[sprawdzany.numer_wierzcholka][i].do_kod] == false)
            {
                Q.insert({sprawdzany.cena + krawedzie[sprawdzany.numer_wierzcholka][i].cena,krawedzie[sprawdzany.numer_wierzcholka][i].do_kod});
            }
        }
        Q.erase(sprawdzany);
    }
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int n = 0, k = 0, m = 0, a = 0, b = 0, wczytany_koszt = 0, min_wynik = 0, wynik = 0;

    cin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; k &amp;gt;&amp;gt; m;

    for (int i = 0 ; i &amp;lt;= n; ++i)
    {
        krawedzie.push_back({});
    }

    for (int i = 0; i &amp;lt; k; ++i)
    {
        cin &amp;gt;&amp;gt; a &amp;gt;&amp;gt; b &amp;gt;&amp;gt; wczytany_koszt;
        krawedzie[a].push_back({wczytany_koszt,b});
        krawedzie[b].push_back({wczytany_koszt,a});
    }

    min_wynik = dijkstra(n);

    for (int i = 0; i &amp;lt; m; ++i)
    {
        cin &amp;gt;&amp;gt; a &amp;gt;&amp;gt; b &amp;gt;&amp;gt; wczytany_koszt;
        krawedzie[a].push_back({wczytany_koszt,b});
        krawedzie[b].push_back({wczytany_koszt,a});

        wynik = dijkstra(n);

        if (wynik &amp;lt; min_wynik)
        {
            cout &amp;lt;&amp;lt; &quot;1 \n&quot;;
            min_wynik = wynik;
        }
        else
        {
            cout &amp;lt;&amp;lt; &quot;0 \n&quot;;
        }
    }


    return 0;
}
&lt;/pre&gt;



&lt;p&gt;Czy wogóle poprawnie piszę ten algorytm ? W sensie żeby była najszybsza wersja.&lt;/p&gt;



&lt;p&gt;Z góry bardzo dziękuję za pomoc!&lt;/p&gt;</description>
<category>Algorytmy</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/568320/zadanie-bitocja-algorytm-dijkstry</guid>
<pubDate>Fri, 17 Jun 2022 21:55:58 +0000</pubDate>
</item>
<item>
<title>Algorytm Dijkstry</title>
<link>https://forum.pasja-informatyki.pl/524122/algorytm-dijkstry</link>
<description>

&lt;p&gt;W jaki sposób zmodyfikować poniższy kod aby prawidłowo czytał&amp;nbsp;z wektora i obliczał drogę metodą D&lt;/p&gt;



&lt;pre class=&quot;brush:cpp;&quot;&gt;
#include &amp;lt;iostream&amp;gt;
#include &amp;lt;cstdlib&amp;gt;
#include &amp;lt;string&amp;gt;
#include &amp;lt;cstring&amp;gt;
#include &amp;lt;fstream&amp;gt;
#include &amp;lt;sstream&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;algorithm&amp;gt;
#include &amp;lt;utility&amp;gt;

//#include &quot;def.cpp&quot;
//#include &quot;funkcje.h&quot;

using namespace std;
struct Node {
    string city;
    vector&amp;lt;pair&amp;lt;unsigned, unsigned&amp;gt;&amp;gt; connections;
};

int findOrAddCity(vector&amp;lt;Node&amp;gt;&amp;amp; g, const string&amp;amp; name)
{
    for (int i = 0; i &amp;lt; g.size(); i++)
        if (g[i].city == name) return i;

    g.push_back({ name, {} });
    return g.size() - 1;
}
int wczytaj_arg(int argc, char* argv[])
{

    int pozI = 0;
    int pozC = 0;
    string nPlikuI = &quot;&quot;;
    string nPlikuC = &quot;&quot;;
    string plik, centrala;
    if (argc == 5)
    {
        for (int i = 0; i &amp;lt; argc; i++) {
            if ((string(argv[i]) == &quot;-i&quot;) and i &amp;lt; argc - 1) {
                pozI = i + 1;
                plik = argv[pozI];
            }
            if ((string(argv[i]) == &quot;-c&quot;) and i &amp;lt; argc - 1) {
                pozC = i + 1;
                centrala = argv[pozC];
            }
        }
        cout &amp;lt;&amp;lt; &quot;\nNazwa pliku wejĹ›ciowego : &quot; &amp;lt;&amp;lt; plik &amp;lt;&amp;lt; endl;
        cout &amp;lt;&amp;lt; &quot;Nazwa Centrali: &quot; &amp;lt;&amp;lt; centrala &amp;lt;&amp;lt; endl;

    }
    else
    {
        cout &amp;lt;&amp;lt; &quot;ZLE ARGUMENTY\n&quot; &amp;lt;&amp;lt; &quot;PODAJ : \n\n&quot; &amp;lt;&amp;lt; &quot;-i nazwa pliku wejsciowego \n -c nazwa centrali\n&quot;;
    }
    return pozI;
}
struct slistEl
{
    slistEl* next;
    int v, w;           // numer wÄ™zĹ‚a docelowego i waga krawÄ™dzi
};

const int MAXINT = 2147483647;
int main(int argc, char* argv[])
{
    system(&quot;chcp 1250&quot;);
    system(&quot;cls&quot;);

    wczytaj_arg(argc, argv);
    string nazwa_pliku = argv[2];

    ifstream ifs(nazwa_pliku);
    vector&amp;lt;Node&amp;gt; graph;
    string m1, m2;
    unsigned dist;

    while (ifs &amp;gt;&amp;gt; m1 &amp;gt;&amp;gt; m2 &amp;gt;&amp;gt; dist) {
        int i1 = findOrAddCity(graph, m1);
        int i2 = findOrAddCity(graph, m2);
        graph[i1].connections.push_back(make_pair(i2, dist));
    }

    for (auto&amp;amp; i : graph) {
        cout &amp;lt;&amp;lt; i.city &amp;lt;&amp;lt; '\n';
        for (auto&amp;amp; c : i.connections)
            cout &amp;lt;&amp;lt; '\t' &amp;lt;&amp;lt; graph[c.first].city &amp;lt;&amp;lt; &quot; - &quot; &amp;lt;&amp;lt; c.second &amp;lt;&amp;lt; '\n';
    }
    int i, j, m, n, v, u, w, x, y, sptr, * d, * p, * S;
    bool* QS;           // Zbiory Q i S
    slistEl** graf;     // Tablica list sÄ…siedztwa
    slistEl* pw, * rw;
    v = 0;
        n = 7;
        m = 7;
   // cin &amp;gt;&amp;gt; v &amp;gt;&amp;gt; n &amp;gt;&amp;gt; m; // WÄ™zeĹ‚ startowy, liczba wierzchoĹ‚kĂłw i krawÄ™dzi

    // Tworzymy tablice dynamiczne

    d = new int[n];          // Tablica kosztĂłw dojĹ›cia
    p = new int[n];          // Tablica poprzednikĂłw
    QS = new bool[n];        // Zbiory Q i S
    graf = new slistEl * [n]; // Tablica list sÄ…siedztwa
    S = new int[n];          // Stos
    sptr = 0;                   // WskaĹşnik stosu

    // Inicjujemy tablice dynamiczne

    for (i = 0; i &amp;lt; n; i++)
    {
        d[i] = MAXINT;
        p[i] = -1;
        QS[i] = false;
        graf[i] = NULL;
    }

    // Odczytujemy dane wejĹ›ciowe

    for (i = 0; i &amp;lt; m; i++)
    {
        cin &amp;gt;&amp;gt; x &amp;gt;&amp;gt; y &amp;gt;&amp;gt; w;    // Odczytujemy krawÄ™dĹş z wagÄ…
        pw = new slistEl;      // Tworzymy element listy sÄ…siedztwa
        pw-&amp;gt;v = y;             // WierzchoĹ‚ek docelowy krawÄ™dzi
        pw-&amp;gt;w = w;             // Waga krawÄ™dzi
        pw-&amp;gt;next = graf[x];
        graf[x] = pw;       // Element doĹ‚Ä…czamy do listy
    }

    cout &amp;lt;&amp;lt; endl;

    d[v] = 0;             // Koszt dojĹ›cia v jest zerowy

    // Wyznaczamy Ĺ›cieĹĽki

    for (i = 0; i &amp;lt; n; i++)
    {
        // Szukamy wierzchoĹ‚ka w Q o najmniejszym koszcie d

        for (j = 0; QS[j]; j++);
        for (u = j++; j &amp;lt; n; j++)
            if (!QS[j] &amp;amp;&amp;amp; (d[j] &amp;lt; d[u])) u = j;

        // Znaleziony wierzchoĹ‚ek przenosimy do S

        QS[u] = true;

        // Modyfikujemy odpowiednio wszystkich sÄ…siadĂłw u, ktĂłrzy sÄ… w Q

        for (pw = graf[u]; pw; pw = pw-&amp;gt;next)
            if (!QS[pw-&amp;gt;v] &amp;amp;&amp;amp; (d[pw-&amp;gt;v] &amp;gt; d[u] + pw-&amp;gt;w))
            {
                d[pw-&amp;gt;v] = d[u] + pw-&amp;gt;w;
                p[pw-&amp;gt;v] = u;
            }
    }

    // Gotowe, wyĹ›wietlamy wyniki

    for (i = 0; i &amp;lt; n; i++)
    {
        cout &amp;lt;&amp;lt; i &amp;lt;&amp;lt; &quot;: &quot;;

        // ĹšcieĹĽkÄ™ przechodzimy od koĹ„ca ku poczÄ…tkowi, 
        // ZapisujÄ…c na stosie kolejne wierzchoĹ‚ki

        for (j = i; j &amp;gt; -1; j = p[j]) S[sptr++] = j;

        // WyĹ›wietlamy Ĺ›cieĹĽkÄ™, pobierajÄ…c wierzchoĹ‚ki ze stosu

        while (sptr) cout &amp;lt;&amp;lt; S[--sptr] &amp;lt;&amp;lt; &quot; &quot;;

        // Na koĹ„cu Ĺ›cieĹĽki wypisujemy jej koszt

        cout &amp;lt;&amp;lt; &quot;$&quot; &amp;lt;&amp;lt; d[i] &amp;lt;&amp;lt; endl;
    }

    // Usuwamy tablice dynamiczne

    delete[] d;
    delete[] p;
    delete[] QS;
    delete[] S;

    for (i = 0; i &amp;lt; n; i++)
    {
        pw = graf[i];
        while (pw)
        {
            rw = pw;
            pw = pw-&amp;gt;next;
            delete rw;
        }
    }

    delete[] graf;
    system(&quot;pause&quot;);

    return 0;
}&lt;/pre&gt;



&lt;p&gt;ijkstry&amp;nbsp;&lt;/p&gt;</description>
<category>C i C++</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/524122/algorytm-dijkstry</guid>
<pubDate>Thu, 07 Jan 2021 16:10:09 +0000</pubDate>
</item>
<item>
<title>Algorytm Dijkstry</title>
<link>https://forum.pasja-informatyki.pl/522942/algorytm-dijkstry</link>
<description>

&lt;p&gt;Mam do rozwiązania poniższe zadnie z zastosowaniem algorytmu Dijkstry. Mam napisane trochę kodu niestety nie wiem jak wprowadzić ten algorytmu&lt;/p&gt;



&lt;pre class=&quot;brush:plain;&quot;&gt;
Firma spedycyjna przyjmuje towary w centrali, skąd rozsyła do odbiorców w całym kraju.
Trasy między miastami są zapisane w pliku w następujący sposób:
&amp;lt;miasto&amp;gt; &amp;lt;miasto&amp;gt; &amp;lt;odległość&amp;gt;
Przykładowy plik:
Szczecin Poznan 220
Szczecin Koszalin 110
Poznan Bytom 300
Poznan Lodz 130
Lodz Katowice 170
Bytom Katowice 15
Bytom Wroclaw 180
W wyniki działania programu zostanie tworzony plik z trasami spedycyjnymi w następującej
postaci (przykład dla centrali w Poznaniu):
Poznan -&amp;gt; Bytom: 300
Poznan -&amp;gt; Lodz -&amp;gt; Katowice: 300
Poznan -&amp;gt; Szczecin -&amp;gt; Koszalin: 330
Poznan -&amp;gt; Lodz: 130
Poznan -&amp;gt; Szczecin: 220
Poznan -&amp;gt; Bytom -&amp;gt; Wroclaw: 480
Trasy spedycyjne mają najkrótsze możliwe długości. Należy wykorzystać algorytm Dĳkstry.
Program uruchamiany jest z linii poleceń z potrzebnymi przełącznikami, natomiast
uruchomienie programu bez parametrów powoduje wypisanie krótkiej instrukcji.&lt;/pre&gt;



&lt;p&gt;&amp;nbsp;&lt;/p&gt;



&lt;pre class=&quot;brush:cpp;&quot;&gt;
#include &amp;lt;iostream&amp;gt;
#include &amp;lt;cstdlib&amp;gt;
#include &amp;lt;string&amp;gt;
#include &amp;lt;cstring&amp;gt;
#include &amp;lt;fstream&amp;gt;
#include &amp;lt;sstream&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;algorithm&amp;gt;
#include &amp;lt;utility&amp;gt;

//#include &quot;def.cpp&quot;
//#include &quot;funkcje.h&quot;

using namespace std;
struct Node {
    string city;
    vector&amp;lt;pair&amp;lt;unsigned, unsigned&amp;gt;&amp;gt; connections;
};

int findOrAddCity(vector&amp;lt;Node&amp;gt;&amp;amp; g, const string&amp;amp; name)
{
    for (int i = 0; i &amp;lt; g.size(); i++)
        if (g[i].city == name) return i;

    g.push_back({ name, {} });
    return g.size() - 1;
}
int wczytaj_arg(int argc, char* argv[])
{
  
        int pozI = 0;
        int pozC = 0;
        string nPlikuI = &quot;&quot;;
        string nPlikuC = &quot;&quot;;
        string plik, centrala;
        if (argc == 5)
        {
            for (int i = 0; i &amp;lt; argc; i++) {
                if ((string(argv[i]) == &quot;-i&quot;) and i &amp;lt; argc - 1) {
                    pozI = i + 1;
                    plik = argv[pozI];
                }
                if ((string(argv[i]) == &quot;-c&quot;) and i &amp;lt; argc - 1) {
                    pozC = i + 1;
                    centrala = argv[pozC];
                }
            }
            cout &amp;lt;&amp;lt; &quot;\nNazwa pliku wejściowego : &quot; &amp;lt;&amp;lt; plik &amp;lt;&amp;lt; endl;
            cout &amp;lt;&amp;lt; &quot;Nazwa Centrali: &quot; &amp;lt;&amp;lt; centrala &amp;lt;&amp;lt; endl;

        }
        else
        {
            cout &amp;lt;&amp;lt; &quot;ZŁE ARGUMENTY\n&quot; &amp;lt;&amp;lt; &quot;PODAJ : \n\n&quot; &amp;lt;&amp;lt; &quot;-i nazwa pliku wejsciowego \n -c nazwa centrali\n&quot;;
        }
        return pozI;
    }

int main(int argc, char* argv[])
{
    
    fstream plik1;
    string linia;
	system(&quot;chcp 1250&quot;);
	system(&quot;cls&quot;);
	
	wczytaj_arg(argc, argv);
	string nazwa_pliku = argv[2];
	
    plik1.open(nazwa_pliku);
    if (plik1.good() == true)
    {
       
           
     
        while (!plik1.eof()) {
            getline(plik1, linia);
            istringstream ifs(linia);


            vector&amp;lt;Node&amp;gt; graph;
            string n1, n2;
            unsigned dist;

            while (ifs &amp;gt;&amp;gt; n1 &amp;gt;&amp;gt; n2 &amp;gt;&amp;gt; dist) {
                int i1 = findOrAddCity(graph, n1);
                int i2 = findOrAddCity(graph, n2);
                graph[i1].connections.push_back(make_pair(i2, dist));
            }


            for (auto&amp;amp; i : graph) {
                cout &amp;lt;&amp;lt; i.city;

                for (auto&amp;amp; c : i.connections)
                    cout &amp;lt;&amp;lt; graph[c.first].city &amp;lt;&amp;lt; &quot; - &quot; &amp;lt;&amp;lt; c.second &amp;lt;&amp;lt; endl;
                
            }

        }
        cout &amp;lt;&amp;lt; endl;
        plik1.close();

    }
    else cout &amp;lt;&amp;lt; &quot;\n\tBłąd otwarcia pliku&quot;;


}&lt;/pre&gt;



&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
<category>C i C++</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/522942/algorytm-dijkstry</guid>
<pubDate>Tue, 29 Dec 2020 19:34:28 +0000</pubDate>
</item>
<item>
<title>algorytm dijkstry  ocena rozwiązania</title>
<link>https://forum.pasja-informatyki.pl/514850/algorytm-dijkstry-ocena-rozwiazania</link>
<description>

&lt;p&gt;Dzień dobry miałem na zadanie rozwiązac poniższy&amp;nbsp;&amp;nbsp;problem i chciałbym się spytać czy moje rozwiązanie jestpoprawne&lt;img alt=&quot;&quot; src=&quot;https://forum.pasja-informatyki.pl/?qa=blob&amp;amp;qa_blobid=8363011891662814793&quot; style=&quot;height:392px; width:600px&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;https://forum.pasja-informatyki.pl/?qa=blob&amp;amp;qa_blobid=4062101755940072677&quot; style=&quot;height:373px; width:600px&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;https://forum.pasja-informatyki.pl/?qa=blob&amp;amp;qa_blobid=13710282726301011309&quot; style=&quot;height:326px; width:600px&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;https://forum.pasja-informatyki.pl/?qa=blob&amp;amp;qa_blobid=15889376729190242752&quot; style=&quot;height:329px; width:600px&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;https://forum.pasja-informatyki.pl/?qa=blob&amp;amp;qa_blobid=8945396424853626566&quot; style=&quot;height:358px; width:600px&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;https://forum.pasja-informatyki.pl/?qa=blob&amp;amp;qa_blobid=7069554723447315931&quot; style=&quot;height:150px; width:600px&quot;&gt;&lt;/p&gt;</description>
<category>Rozwój zawodowy, nauka, praca</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/514850/algorytm-dijkstry-ocena-rozwiazania</guid>
<pubDate>Tue, 03 Nov 2020 17:12:25 +0000</pubDate>
</item>
<item>
<title>Algorytm Dijkstry</title>
<link>https://forum.pasja-informatyki.pl/487354/algorytm-dijkstry</link>
<description>

&lt;p&gt;Witam wszystkich, muszę uzupełnić taką tabelkę:&amp;nbsp;&lt;img alt=&quot;Tabelka&quot; src=&quot;https://forum.pasja-informatyki.pl/?qa=blob&amp;amp;qa_blobid=5604274198740185078&quot; style=&quot;height:78px; width:302px&quot;&gt;&lt;/p&gt;



&lt;p&gt;&amp;nbsp;&lt;/p&gt;



&lt;p&gt;Na podstawie algorytmu&amp;nbsp;Dijkstry, czyli muszę przedstawić przebieg algorytmu&amp;nbsp;Dijkstry oraz arytmu Bellmana-Forda
&lt;br&gt;
Dla poniższego grafu,&amp;nbsp;&lt;img alt=&quot;Graf&quot; src=&quot;https://forum.pasja-informatyki.pl/?qa=blob&amp;amp;qa_blobid=10040932689680050915&quot; style=&quot;height:213px; width:242px&quot;&gt; &amp;nbsp;kompletnie nie wiem jak powinna wyglądać ta&amp;nbsp;tabelka, pomimo tego że uważam że wiem jak działa ten algorytm&lt;/p&gt;</description>
<category>Matematyka, fizyka, logika</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/487354/algorytm-dijkstry</guid>
<pubDate>Sun, 10 May 2020 07:46:38 +0000</pubDate>
</item>
<item>
<title>Algorytm Dijkstry</title>
<link>https://forum.pasja-informatyki.pl/474666/algorytm-dijkstry</link>
<description>W jaki sposób mogę zmienić klasyczną implementacje algorytmu Dijktstry, żeby ograniczyć zużycie pamięci? Moja implementacja przy założeniu, każdy wierzchołek ma połączenie z każdym, przy tworzeniu tablicy wag krawędzi zużywa ogromne ilości pamięci. W jaki sposób mogę zoptymalizować algorytm by ten zużywał jak najmniej pamięci?</description>
<category>C i C++</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/474666/algorytm-dijkstry</guid>
<pubDate>Fri, 06 Mar 2020 11:59:53 +0000</pubDate>
</item>
<item>
<title>Algorytm Dijkstry a Drzewo List</title>
<link>https://forum.pasja-informatyki.pl/464453/algorytm-dijkstry-a-drzewo-list</link>
<description>Witam. Mam problem z zastosowaniem algorytmu Dijkstry do drzewa list gdzie każde drzewo przechowuje nazwę wierzchołku oraz wskaźnik do listy w której każdy element zawiera odległość &amp;nbsp;do innego wierzchołka,który wskazywany jest przez wskaźnik do drzewa. Widziałem kilka różnych implementacji tego algorytmu, ale zupełnie nie wiem jak go dostosować pod mój problem oraz jak poruszać się po drzewie (na myśl przychodzi mi rekurencja)? Najlepiej jakby było to z użyciem std::priority_queue.</description>
<category>C i C++</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/464453/algorytm-dijkstry-a-drzewo-list</guid>
<pubDate>Thu, 26 Dec 2019 22:25:02 +0000</pubDate>
</item>
<item>
<title>Porównać algorytm A* z algorytmem Dijkstry</title>
<link>https://forum.pasja-informatyki.pl/462102/porownac-algorytm-a-z-algorytmem-dijkstry</link>
<description>Witam, mam problem z algorytmami A* oraz Dijkstry. Nie zostały one dobrze wytłumaczone i teraz mam z nimi kłopot. Czy ktoś mógłby je porównać ze sobą ? Oraz najprościej wytłumaczyć A* ? Grupa 185IC będzie wdzięczna !</description>
<category>Rozwój zawodowy, nauka, praca</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/462102/porownac-algorytm-a-z-algorytmem-dijkstry</guid>
<pubDate>Sun, 08 Dec 2019 19:48:46 +0000</pubDate>
</item>
<item>
<title>Przekonwertuj algorytm Dijkstra na A* (Astar)</title>
<link>https://forum.pasja-informatyki.pl/351161/przekonwertuj-algorytm-dijkstra-na-a-astar</link>
<description>

&lt;p&gt;Witam,
&lt;br&gt;
Dostałem zadanie w którym muszę przekonwertować algorytm Dijkstra na A* i totalnie nie mam pojęcia jak to zrobić.
&lt;br&gt;

&lt;br&gt;
Tutaj jest kod źródłowy Dijkstry, w razie jak by czegoś brakowało, napiszcie, potrzebuję pilnie pomocy!&lt;/p&gt;



&lt;pre class=&quot;brush:java;&quot;&gt;
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package nl.hva.dmci.ict.se.sortingsearching.pathfinding;

import java.util.Stack;
import nl.hva.dmci.ict.se.sortingsearching.weigthedgraph.DirectedEdge;
import nl.hva.dmci.ict.se.sortingsearching.weigthedgraph.EdgeWeightedDigraph;
import nl.hva.dmci.ict.se.sortingsearching.weigthedgraph.IndexMinPQ;

/**
 *
 * @author kamci
 */
public class Astar {
    private double[] distTo;          // distTo[v] = distance  of shortest s-&amp;gt;v path
    private DirectedEdge[] edgeTo;    // edgeTo[v] = last edge on shortest s-&amp;gt;v path
    private IndexMinPQ&amp;lt;Double&amp;gt; pq;    // priority queue of vertices
    private int vertexesProcessed = 0;

    public int getVertexesProcessed() {
        return vertexesProcessed;
    }
    /**
     * Computes a shortest paths tree from &amp;lt;tt&amp;gt;s&amp;lt;/tt&amp;gt; to every other vertex in
     * the edge-weighted digraph &amp;lt;tt&amp;gt;G&amp;lt;/tt&amp;gt;.
     * @param G the edge-weighted digraph
     * @param s the source vertex
     * @throws IllegalArgumentException if an edge weight is negative
     * @throws IllegalArgumentException unless 0 &amp;amp;le; &amp;lt;tt&amp;gt;s&amp;lt;/tt&amp;gt; &amp;amp;le; &amp;lt;tt&amp;gt;V&amp;lt;/tt&amp;gt; - 1
     */
    public Astar(EdgeWeightedDigraph G, int s) {
        for (DirectedEdge e : G.edges()) {
            if (e.weight() &amp;lt; 0)
                throw new IllegalArgumentException(&quot;edge &quot; + e + &quot; has negative weight&quot;);
        }

        distTo = new double[G.V()];
        edgeTo = new DirectedEdge[G.V()];
        for (int v = 0; v &amp;lt; G.V(); v++)
            distTo[v] = Double.POSITIVE_INFINITY;
        distTo[s] = 0.0;

        // relax vertices in order of distance from s
        pq = new IndexMinPQ&amp;lt;Double&amp;gt;(G.V());
        pq.insert(s, distTo[s]);
        while (!pq.isEmpty()) {
            int v = pq.delMin();
            for (DirectedEdge e : G.adj(v))
                relax(e);
        }

        // check optimality conditions
        assert check(G, s);
    }

    // relax edge e and update pq if changed
    private void relax(DirectedEdge e) {
        int v = e.from(), w = e.to();
        if (distTo[w] &amp;gt; distTo[v] + e.weight()) {
            distTo[w] = distTo[v] + e.weight();
            edgeTo[w] = e;
            vertexesProcessed++;
            if (pq.contains(w)) pq.decreaseKey(w, distTo[w]);
            else                pq.insert(w, distTo[w]);
        }
    }

    /**
     * Returns the length of a shortest path from the source vertex &amp;lt;tt&amp;gt;s&amp;lt;/tt&amp;gt; to vertex &amp;lt;tt&amp;gt;v&amp;lt;/tt&amp;gt;.
     * @param v the destination vertex
     * @return the length of a shortest path from the source vertex &amp;lt;tt&amp;gt;s&amp;lt;/tt&amp;gt; to vertex &amp;lt;tt&amp;gt;v&amp;lt;/tt&amp;gt;;
     *    &amp;lt;tt&amp;gt;Double.POSITIVE_INFINITY&amp;lt;/tt&amp;gt; if no such path
     */
    public double distTo(int v) {
        return distTo[v];
    }

    /**
     * Is there a path from the source vertex &amp;lt;tt&amp;gt;s&amp;lt;/tt&amp;gt; to vertex &amp;lt;tt&amp;gt;v&amp;lt;/tt&amp;gt;?
     * @param v the destination vertex
     * @return &amp;lt;tt&amp;gt;true&amp;lt;/tt&amp;gt; if there is a path from the source vertex
     *    &amp;lt;tt&amp;gt;s&amp;lt;/tt&amp;gt; to vertex &amp;lt;tt&amp;gt;v&amp;lt;/tt&amp;gt;, and &amp;lt;tt&amp;gt;false&amp;lt;/tt&amp;gt; otherwise
     */
    public boolean hasPathTo(int v) {
        return distTo[v] &amp;lt; Double.POSITIVE_INFINITY;
    }

    /**
     * Returns a shortest path from the source vertex &amp;lt;tt&amp;gt;s&amp;lt;/tt&amp;gt; to vertex &amp;lt;tt&amp;gt;v&amp;lt;/tt&amp;gt;.
     * @param v the destination vertex
     * @return a shortest path from the source vertex &amp;lt;tt&amp;gt;s&amp;lt;/tt&amp;gt; to vertex &amp;lt;tt&amp;gt;v&amp;lt;/tt&amp;gt;
     *    as an iterable of edges, and &amp;lt;tt&amp;gt;null&amp;lt;/tt&amp;gt; if no such path
     */
    public Iterable&amp;lt;DirectedEdge&amp;gt; pathTo(int v) {
        if (!hasPathTo(v)) return null;
        Stack&amp;lt;DirectedEdge&amp;gt; path = new Stack&amp;lt;DirectedEdge&amp;gt;();
        for (DirectedEdge e = edgeTo[v]; e != null; e = edgeTo[e.from()]) {
            path.push(e);
        }
        return path;
    }


    // check optimality conditions:
    // (i) for all edges e:            distTo[e.to()] &amp;lt;= distTo[e.from()] + e.weight()
    // (ii) for all edge e on the SPT: distTo[e.to()] == distTo[e.from()] + e.weight()
    private boolean check(EdgeWeightedDigraph G, int s) {

        // check that edge weights are nonnegative
        for (DirectedEdge e : G.edges()) {
            if (e.weight() &amp;lt; 0) {
                System.err.println(&quot;negative edge weight detected&quot;);
                return false;
            }
        }

        // check that distTo[v] and edgeTo[v] are consistent
        if (distTo[s] != 0.0 || edgeTo[s] != null) {
            System.err.println(&quot;distTo[s] and edgeTo[s] inconsistent&quot;);
            return false;
        }
        for (int v = 0; v &amp;lt; G.V(); v++) {
            if (v == s) continue;
            if (edgeTo[v] == null &amp;amp;&amp;amp; distTo[v] != Double.POSITIVE_INFINITY) {
                System.err.println(&quot;distTo[] and edgeTo[] inconsistent&quot;);
                return false;
            }
        }

        // check that all edges e = v-&amp;gt;w satisfy distTo[w] &amp;lt;= distTo[v] + e.weight()
        for (int v = 0; v &amp;lt; G.V(); v++) {
            for (DirectedEdge e : G.adj(v)) {
                int w = e.to();
                if (distTo[v] + e.weight() &amp;lt; distTo[w]) {
                    System.err.println(&quot;edge &quot; + e + &quot; not relaxed&quot;);
                    return false;
                }
            }
        }

        // check that all edges e = v-&amp;gt;w on SPT satisfy distTo[w] == distTo[v] + e.weight()
        for (int w = 0; w &amp;lt; G.V(); w++) {
            if (edgeTo[w] == null) continue;
            DirectedEdge e = edgeTo[w];
            int v = e.from();
            if (w != e.to()) return false;
            if (distTo[v] + e.weight() != distTo[w]) {
                System.err.println(&quot;edge &quot; + e + &quot; on shortest path not tight&quot;);
                return false;
            }
        }
        return true;
    }
}
&lt;/pre&gt;



&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
<category>Java</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/351161/przekonwertuj-algorytm-dijkstra-na-a-astar</guid>
<pubDate>Thu, 17 May 2018 15:39:40 +0000</pubDate>
</item>
</channel>
</rss>