Cod sursa(job #2470192)

Utilizator adiaioanaAdia R. adiaioana Data 8 octombrie 2019 20:32:42
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <fstream>
#include <vector>
#include <queue>
#define c second
#define n first
#define inf 1000000000
#define NM 100010
using namespace std;
ifstream cin("dijkstra.in");
ofstream cout("dijkstra.out");

int N,d[NM],ok[NM],p,ox,oc;
vector<pair<int,int>> A[NM];
struct compare {
bool operator() (int x,int y) {
    return d[x]>d[y];
} };
priority_queue <int, vector<int>, compare> q;

void scan();
void daicstra();
void print();

int main()
{
    p=1;
    scan();
    daicstra();
    print();

    return 0;
}

void scan()
{
    int x,y,C,useless;
    cin>>N>>useless;
    d[p]=0;
    for(int i=1; i<=N; ++i)
        if(i!=p)
            d[i]=inf;
   while(useless)
    {
        cin>>x>>y>>C;
        A[x].push_back({y,C});
        useless--;
    }
}

void daicstra()
{
    int nr=0,im=0,lg=0;
    pair<int, int> el;
    nr=1;
    q.push(p);
    ok[p]=1;

    while(!q.empty())
    {
        im=q.top(); q.pop();
        ok[im]=0;

        for(int i=0; i<A[im].size(); ++i)
        {
            ox=A[im][i].n;
            oc=A[im][i].c;
            lg=d[im]+oc;
            if(lg<d[ox])
            {
                d[ox]=lg;
                if(ok[ox]==0)
                {
                    ok[ox]=1;
                    q.push(ox);
                }
            }
        }
    }
}

void print()
{
    for(int i=2; i<=N; ++i, cout<<' ')
        if(d[i]!=inf)
            cout<<d[i];
        else cout<<0;
    cout<<'\n';
}