Cod sursa(job #3256803)

Utilizator tomitamateyTomita Matei tomitamatey Data 16 noiembrie 2024 10:14:53
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.06 kb
#include <fstream>
#include <queue>
#include <algorithm>
using namespace std;
ifstream cin ("dijkstra.in");
ofstream cout ("dijkstra.out");

int n,m,r[50100],P[50100],node,p,val;
struct edge
{
    int x,y,val;
}v[250100];

bool ord (edge a,edge b)
{
    return a.x<b.x;
}

int main()
{
    cin>>n>>m;
    for (int i=1; i<=m; i++)
    cin>>v[i].x>>v[i].y>>v[i].val;

    sort (v+1,v+m+1,ord);
    for (int i=1; i<=m; i++)
    if (!P[v[i].x]) P[v[i].x]=i;

    priority_queue<pair<int,int>>Q;
    for (int i=2; i<=n; i++) r[i]=2000000000;

    Q.push(make_pair(0,1));
    while (!Q.empty())
    {
        val=Q.top().first;
        node=Q.top().second;
        Q.pop();
        if (val==r[node])
        {

        p=P[node];
        while (v[p].x==node)
        {
            r[v[p].y]=min(r[v[p].y],r[node]+v[p].val);
            Q.push(make_pair(r[v[p].y],v[p].y));
            p++;
        }

        }

    }

    for (int i=2; i<=n; i++)
    if (r[i]!=2000000000) cout<<r[i]<<" ";
    else cout<<0<<" ";
    return 0;
}