Cod sursa(job #1333442)

Utilizator supermitelArdelean Razvan Mitel supermitel Data 3 februarie 2015 10:13:21
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <queue>
#define inf 1<<30

using namespace std;

struct vecin
{
    int x, c;
    vecin(int x = 0, int c = 0):x(x), c(c){}
};
vector<vecin> vec[50010];

int n;
int dmin[50010];

struct cmp
{
    bool operator()(int x, int y)
    {
        return dmin[x] > dmin[y];
    }
};
priority_queue<int, vector<int>, cmp> q;

void citire()
{
    int m, x, y, c;
    scanf("%d%d", &n, &m);
    for(int i = 0; i < m; i++)
    {
        scanf("%d%d%d", &x, &y, &c);
        vec[x].push_back(vecin(y, c));
    }
}

void dijkstra()
{
    for(int i = 2; i <= n; i++)
        dmin[i] = inf;
    q.push(1);

    int vf;

    while(!q.empty())
    {
        vf = q.top();
        q.pop();
        for(int i = 0; i < vec[vf].size(); i++)
        {
            int cost = dmin[vf] + vec[vf][i].c;
            int v = vec[vf][i].x;
            if(cost < dmin[v])
            {
                dmin[v] = cost;
                q.push(v);
            }
        }
    }
}

void afisare()
{
    for(int i = 2; i <= n; i++)
    if(dmin[i] == inf)
        printf("0 ");
    else printf("%d ", dmin[i]);
    printf("\n");
}

int main()
{
    freopen("dijkstra.in", "r", stdin);
    freopen("dijkstra.out", "w", stdout);

    citire();
    dijkstra();
    afisare();

    return 0;
}