Cod sursa(job #1713740)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 6 iunie 2016 14:15:09
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#include <queue>
#include <cstring>

#define Nmax 666013
#define start 1
#define INF 0x3f3f3f3f

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

int N,M;
int best[Nmax],delta[Nmax],tree_dad[Nmax];

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

void Dijkstra(int k)
{/// O( (N+M)log(N+M) )
    memset(best,INF,sizeof(best));
    best[k] = 0;

    memset(delta,INF,sizeof(delta));
    delta[k] = 0;

    Q.push({0,k});
    int cost;
    while(!Q.empty())
    {
        k = Q.top().second;
        cost = -Q.top().first;
        delta[k] = best[k];
        Q.pop();
        if(delta[k] < cost)
            continue; /// optimize the priority queue
        for(auto it : G[k])
            if(best[it.second] > best[k] + it.first)
            {
                tree_dad[it.second] = k;
                best[it.second] = best[k] + it.first;
                Q.push({-best[it.second],it.second});
            }
    }
    for(int i = 1; i <= N; ++i)
        if(i != start)
        {
            if(delta[i] == INF)
                printf("0 ");
            else
                printf("%d ",delta[i]);
        }
}

int main()
{
    freopen("dijkstra.in","r",stdin);
    freopen("dijkstra.out","w",stdout);
    Read();
    Dijkstra(start);
    return 0;
}