Cod sursa(job #1735363)

Utilizator flaviu_2001Craciun Ioan-Flaviu flaviu_2001 Data 29 iulie 2016 17:13:56
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <cstdio>
#include <vector>
#include <set>
#define MAX 50005
#define INF 1 << 30

using namespace std;

int n, m, d[MAX];
vector<pair <int, int> > v[MAX];

void read();
void solve();
void write();

int main()
{
    read();
    solve();
    write();
    return 0;
}

void read()
{
    freopen ("dijkstra.in", "r", stdin);
    scanf ("%d%d", &n, &m);
    for (int i = 2; i <= n; ++i)
        d[i] = INF; d[1] = 0;
    for(int i = 1; i <= n; ++i)
    {
        int x, y, z;
        scanf ("%d %d %d", &x, &y, &z);
        v[x].push_back(make_pair(y, z));
    }
    fclose(stdout);
}

void solve()
{
    set <pair <int, int> > s;
    s.insert (make_pair(0, 1));
    while (!s.empty())
    {
        int node = s.begin()-> second;
        int value = s.begin()-> first;
        s.erase(s.begin());
        for (unsigned int i = 0; i < v[node].size(); ++i)
            if (d[v[node][i].first] > v[node][i].second + value){
                d[v[node][i].first] = v[node][i].second + value;
                s.insert(make_pair(d[v[node][i].first], v[node][i].first));
            }
    }
}

void write()
{
    freopen ("dijkstra.out", "w", stdout);
    for (int i = 2; i <= n; ++i)
        if (d[i] == INF)
            printf ("0 ");
        else printf ("%d ", d[i]);
    printf ("\n");
    fclose(stdout);
}