Cod sursa(job #1486468)

Utilizator serbanSlincu Serban serban Data 14 septembrie 2015 21:46:37
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.35 kb
#include <bits/stdc++.h>

using namespace std;

struct node{
node *next;
int to;
int length;
};
node *a[50005];
long long d[50005];
int poz[50005];
int h[50005], k;

void percolate(int i) {
    int tata;
    while(i > 1) {
        tata = i >> 1;
        if(d[h[tata]] > d[h[i]]) {
            poz[h[tata]] = i;
            poz[h[i]] = tata;
            int aux = h[i];
            h[i] = h[tata];
            h[tata] = aux;
            i = tata;
        }
        else i = 1;
    }
}

void sift(int i) {
    int son;
    while(i <= k) {
        son = i;
        if((i << 1) <= k) {
            son = i << 1;
            if(son < k)
                if(d[h[son]] > d[h[son + 1]])
                    son ++;
            if(d[h[son]] < d[h[i]]) {
                poz[h[son]] = i;
                poz[h[i]] = son;
                int aux = h[son];
                h[son] = h[i];
                h[i] = aux;
                i = son;
            }
            else return;
        }
        else return;
    }
}

int main()
{
    FILE *f = fopen("dijkstra.in", "r");
    FILE *g = fopen("dijkstra.out", "w");
    int n, m;
    fscanf(f, "%d %d", &n, &m);
    for(int i = 1; i <= m; i ++) {
        int from, to, length;
        fscanf(f, "%d %d %d", &from, &to, &length);
        node *one = new node;
        one->to = to;
        one->length = length;
        one->next = a[from];
        a[from] = one;
    }

    for(int i = 2; i <= n; i ++) {
        d[i] = 50000005;
        poz[i] = -1;
    }
    poz[1] = 1;
    h[++ k] = 1;
    while ( k )
    {
        int mn = h[1];
        h[1] = h[k];
        poz[ h[1] ] = 1;
        --k;

        sift(1);

        node *q = a[mn];

        while ( q )
        {
            if ( d[q->to] > d[mn] + q->length )
            {
                d[q->to] = d[mn] + q->length;

                if ( poz[q->to] != -1 )
                    percolate( poz[q->to] );
                else
                {
                    h[++k] = q->to;
                    poz[ h[k] ] = k;
                    percolate( k );
                }
            }
            q = q->next;
        }
    }
    for(int i = 2; i <= n; i ++) {
        if(d[i] == 50000005)
            fprintf(g, "0 ");
        else fprintf(g, "%d ", d[i]);
    }
    fprintf(g, "\n");
    return 0;
}