Cod sursa(job #1435543)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 13 mai 2015 19:14:40
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.36 kb
/*
    how about a coding trick?
*/
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstring>
#define DIM 60000
#define INF ((1<<31)-1)
#define f first
#define s second
using namespace std;

FILE *fin = fopen("dijkstra.in" ,"r");
FILE *fout= fopen("dijkstra.out","w");

int Point[DIM], Cost[DIM], N, M, K;
pair <int, int> Heap[DIM];
vector <int> V[DIM]; int X, Y, Z;

void SetUp(){
    fscanf(fin, "%d %d ", &N, &M);
    for(int i = 1; i <= M; i ++){
        fscanf(fin, "%d %d %d ", &X, &Y, &Z);
        V[X].push_back(Y);
        V[X].push_back(Z);
    } K = 1;
    Heap[1].f = 0; Heap[1].s = 1; Point[1] = 1;
    for(int i = 2; i <= N; i ++){
        K ++;
        Point[K] = i;
        Heap[K].f = INF;
        Heap[K].s = i;
    }
    return;
}

void Shift(pair<int, int> Heap[], int Point[], int poz, int N){
    if(poz != 1 && Heap[poz/2].f > Heap[poz].f){
        swap(Heap[poz], Heap[poz/2]);
        Point[Heap[poz].s] = poz;
        Point[Heap[poz/2].s] = poz/2;
        Shift(Heap, Point, poz/2, N);
    } return;
}

void Percolate(pair<int, int> Heap[], int Point[], int poz, int N){
    int poz2 = poz * 2;
    if(poz2 <= N){
        if(poz2 + 1 <= N && Heap[poz2].f > Heap[poz2+1].f) poz2++;
        if(Heap[poz] > Heap[poz2]){
            swap(Heap[poz], Heap[poz2]);
            Point[Heap[poz].s] = poz;
            Point[Heap[poz2].s] = poz2;
            Percolate(Heap, Point, poz2, N);
    }   } return;
}

void Dijkstra(){
    int poz, poz2, cost;
    while(K != 0){
        poz = Heap[1].s;
        Cost[poz] = Heap[1].f;
        for(int i = 0; i < V[poz].size(); i += 2){
            poz2 = V[poz][i];
            cost = V[poz][i+1];
            if(Heap[Point[poz2]].f > Cost[poz] + cost){
                Heap[Point[poz2]].f = Cost[poz] + cost;
                Shift(Heap, Point, Point[poz2], K);
                Percolate(Heap, Point, Point[poz2], K);
            }
        }
        Point[Heap[1].s] = K;
        Heap[1].f = Heap[K].f; Heap[K].f = 0;
        Heap[1].s = Heap[K].s; Heap[K].s = 0;
        Point[Heap[1].s] = 1;
        K --;
        Percolate(Heap, Point, 1, K);
    }
    return;
}

void Finish(){
    for(int i = 2; i <= N; i ++)
        fprintf(fout, "%d ", Cost[i]);
    return;
}

int main(){
    SetUp();
    Dijkstra();
    Finish();
    return 0;
}