fbpx

Problema #588 – Dijkstra – Rezolvari PBInfo

de Mihai-Alexandru

Cerința

Se dă un graf orientat ponderat cu n noduri – în care fiecare arc are asociat un cost, număr natural strict pozitiv, și un nod p. Să se determine, folosind algoritmul lui Dijkstra, costul minim al drumului de la p la fiecare nod al grafului.

Date de intrare

Fișierul de intrare dijkstra.in conține pe prima linie numerele n p, iar următoarele linii câte un triplet i j c, cu semnificația: există arcul (i j) și are costul c.

Date de ieșire

Fișierul de ieșire dijkstra.out va conține pe prima linie n numere, separate prin exact un spațiu, al i-lea număr reprezentând costul drumului minim de la p la i. Dacă nu există drum de la p la un anumit vârf, costul afișat va fi -1.

Restricții și precizări

  • 1 ≤ n ≤ 100
  • costul unui arc va fi mai mic decât 1000
  • costul unui drum este egal cu suma costurilor arcelor care îl compun

Exemplu

dijkstra.in

5 4
1 3 1
2 1 2
4 2 1
4 3 8
5 3 5
5 4 2

dijkstra.out

3 1 4 0 -1
#include <bits/stdc++.h>


using namespace std;
#define Inf 0x3f3f3f3f

ifstream cin("dijkstra.in");
ofstream cout("dijkstra.out");

using PI = pair<int , int>;
int n , m , x , y , p , D[100001] , w;
vector <PI> G[100001];

void dijkstra(int nod)
{
    priority_queue < PI , vector<PI> , greater<PI> > Q;
    D[nod] = 0;
    Q.push({0 , nod});
    while(!Q.empty())
    {
       x = Q.top().first;
       y = Q.top().second;
       Q.pop();
       if(x > D[y]) continue;
       for(auto& q:G[y])
       {
           int nodnou = q.first;
           int costnou = q.second;
           if(D[nodnou] > D[y] + costnou)
           {
               D[nodnou] = D[y] + costnou;
               Q.push({D[nodnou] , nodnou});
           }
       }
    }
}

int main()
{
    cin >> n >> p;
    while(cin >> x >> y >> w)
        G[x].push_back({y , w});

    for(int i = 1 ; i <= n ; i++)
        D[i] = Inf;
    dijkstra(p);
    for(int i = 1 ; i <= n ; i++)
        if(D[i] == Inf) cout << "-1 ";
        else cout << D[i] << " ";
}
Comentarii

S-ar putea sa iti placa