Cod sursa(job #1012308)

Utilizator smaraldaSmaranda Dinu smaralda Data 18 octombrie 2013 17:59:30
Problema Algoritmul lui Dijkstra Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.38 kb
#include<stdio.h>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;

const int NMAX = 50000,INF = (1 << 30);

struct GRAPH { int node, cost; };
vector <GRAPH> graph[NMAX+ 5];
vector <GRAPH>::iterator it;
GRAPH heap[4 * NMAX + 10];
int pos[NMAX + 10], vis[NMAX + 5], dmin[NMAX + 5],n,hSize;

void swapNodes (int x, int y) {
    swap(heap[pos[x]],heap[pos[y]]);
    swap(pos[x],pos[y]);
}

void up (int p) {
    int father = p / 2;
    while(father && heap[father].cost > heap[p].cost) {
        swapNodes(p,father);
        father = p / 2;
        p /= 2;
        }
}

void getSons (int node, int &left, int &right) {
    left = node * 2;
    right = left + 1;
    if(left > hSize)
        left = 0;
    if(right > hSize)
        right = 0;
}

void down (int p) {
    int left,right;
    getSons(p,left,right);
    while(heap[p].cost < heap[left].cost || heap[p].cost < heap[right].cost) {
        if(heap[left].cost < heap[right].cost) {
            swapNodes(p,left);
            p = left;
            }
        else {
            swapNodes(p,right);
            p = right;
            }
        getSons(p,left,right);
        }
}

void insert(int node, int val) {
    heap[++hSize] = {node,val};
    up(hSize);
}

void update (int node) {
    if(pos[node] == 0)
        insert(node,dmin[node]);
    else {
        heap[pos[node]].cost = dmin[node];
        up(pos[node]);
        }
}

void del () {
    pos[heap[1].node] = 0;
    swap(heap[1],heap[hSize]);
    hSize--;
    down(1);
}

void dijkstra (int start) {
    int i,node;
    heap[0] = {INF, INF};
    for(i = 1; i <= n; i++)
        dmin[i] = INF;
    dmin[1] = 0;
    update(1);
    node = start;
    while(node) {
        for(it = graph[node].begin(); it < graph[node].end(); it++)
            if(it -> cost + dmin[node] < dmin[it -> node]) {
                dmin[it -> node] = it -> cost + dmin[node];
                update(it -> node);
                }
        del();
        node = heap[1].node;
        vis[node] = 1;
        }
}

int main() {
    freopen("dijkstra.in","r",stdin);
    freopen("dijkstra.out","w",stdout);
    int a,b,c,m,i;
    scanf("%d%d",&n,&m);
    for(i = 1; i <= m; i++) {
        scanf("%d%d%d",&a,&b,&c);
        graph[a].push_back({b,c});
        }

    dijkstra(1);

    for(i = 2; i <= n; i++) {
        if(!vis[i])
            dmin[i] = 0;
        printf("%d ",dmin[i]);
        }
    return 0;
}