Cod sursa(job #1283977)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 6 decembrie 2014 09:55:13
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <cstdio>
#include <algorithm>
#include <queue>
#include <cstring>
#include <vector>

#define Nmax 50005
#define cost first
#define vecin second
#define INF 0x3f3f3f3f

using namespace std;
int D[Nmax],N,M;
vector< pair<int,int> > G[Nmax];
priority_queue< pair<int,int> > Heap;

void read()
{
    scanf("%d%d",&N,&M);
    int a,b,c;
    for(int i = 1; i <= M; ++i)
    {
        scanf("%d%d%d",&a,&b,&c);
        G[a].push_back(make_pair(c,b));
    }
    memset(D,INF,sizeof(D));
}

void dijkstra(int k)
{
    D[1] = 0;
    Heap.push(make_pair(0,k));
    while(!Heap.empty())
    {
        k = Heap.top().vecin;
        Heap.pop();
        for(vector<pair<int,int> >::iterator it = G[k].begin(); it != G[k].end(); ++it)
            if(D[it->vecin] > D[k] + it->cost) /// dist pana la vecin e > dist pana la k + muchia
            {
                D[it->vecin] = D[k] + it->cost;
                Heap.push(make_pair(-D[it->vecin], it->vecin));
            }
    }
}

void print()
{
    for(int i = 2; i <= N; ++i)
        if(D[i] != INF)
            printf("%d ",D[i]);
        else
            printf("0 ");
}

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

    read();
    dijkstra(1);
    print();

    return 0;
}