Cod sursa(job #1135858)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 8 martie 2014 14:58:16
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#include <memory.h>
#include <queue>

#define INF 0x3f3f3f3f
#define Nmax 50005
#define pb push_back
#define mp make_pair
#define next second
#define cost first
#define piiIT vector<pair<int,int> >::iterator

using namespace std;
priority_queue<pair<int,int>,vector<pair<int,int> >, greater<pair<int,int> > > Q;
vector<pair<int,int> > G[Nmax];
int N,M,DP[Nmax];

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].pb(mp(c,b));
    }
    memset(DP,INF,sizeof(DP));
}

void dykstra(int k)
{
    Q.push(mp(0,k));
    DP[k] = 0;
    while(!Q.empty())
    {
        k = Q.top().next;Q.pop();
        for(piiIT it = G[k].begin(); it != G[k].end(); ++it)
            if(DP[it->next] > DP[k] + it->cost)
            {
                DP[it->next] = DP[k] + it->cost;
                Q.push(mp(DP[it->next],it->next));
            }
    }
}

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

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

    read();
    dykstra(1);
    afish();

    return 0;
}