Cod sursa(job #2703581)

Utilizator Costea_AlexandruCostea Alexandru Costea_Alexandru Data 8 februarie 2021 19:38:07
Problema Algoritmul lui Dijkstra Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <fstream>
#include <queue>
using namespace std;
ifstream fi("dijkstra.in");
ofstream fo("dijkstra.out");
priority_queue<pair<int,int>> d1;
struct nod { int y, c;
             nod* urm; } *v[50001];
int n, p, i, j, k,d[50001],f[50001];
const int inf = 1000000000;
void AdNod(int i, int j, int k)
{
    nod* q;
    q = new nod;
    q->y = j;
    q->c = k;
    q->urm = v[i];
    v[i] = q;
}
void Dijkstra(int p)
{
    nod* q;
    int mi,i,j;
    q = v[p];
    d[0] = inf;
    d[p] = 0;
    f[p] = 1;
    while (q != NULL)
    {
        d[q->y] = q->c;
        q = q->urm;
    }
    for(i=1; i<=n; i++)
        if(d[i]!= inf)
          d1.push(make_pair(-1*d[i],i));
    for (i = 1; i < n; i++)
    {
        mi = d1.top().second;
        if (!d1.empty())
        {
            f[mi] = 1;
            q = v[mi];
            while (q != NULL)
            {
                if (d[q->y] > d[mi] + q->c)
                {
                    d[q->y] = d[mi] + q->c;
                    d1.push(make_pair(-1*d[q->y],q->y));
                }
                q = q->urm;
            }
        }
        d1.pop();
    }
}
int main()
{
    fi >> n >> p;
    for (i = 1; i <= n; i++)
    {
        v[i] = NULL;
        d[i] = inf;
    }
    while (fi >> i >> j >> k)
        AdNod(i, j, k);
    Dijkstra(1);
    for (i = 2; i <= n; i++)
    {
        if (d[i] == inf)
            fo << 0 << " ";
        else fo << d[i] << " ";
    }
    return 0;
}