Cod sursa(job #704411)

Utilizator xulescuStefu Gabriel xulescu Data 2 martie 2012 17:53:42
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.15 kb
#include <cstdio>

#define MAXINT 0x3f3f3f3f
#define MAXN 50003
int n, m;

typedef struct list{
    int b,c;
    list* next;
} list;

list* graf[MAXN+1];

void add(int a, int b, int c){
    list *p = new list;
    p->b = b;
    p->c = c;
    p->next = graf[a];
    graf[a] = p;
}

void swap(int &a, int &b){
    int c = a;
    a = b; b = c;
}

bool viz[MAXN];
int dist[MAXN+1];
int heap[MAXN];
int pozh[MAXN];
int dim = 0;

bool maimic(int p1,int p2){
    if(dist[heap[p1]] < dist[heap[p2]]) return true;
    return false;
}
void upheap(int poz){
    if(poz==1) return;
    int p = poz/2;
    if(maimic(poz,p)){
        swap(pozh[heap[poz]],pozh[heap[p]]);
        swap(heap[poz],heap[p]);
        upheap(p);
    }
}
void downheap(int poz){
    int f1 = poz*2;
    int f2 = poz*2+1;
    int min = poz;
    if(f1<=dim) min = maimic(poz,f1)?poz:f1;
    if(f2<=dim) min = maimic(min,f2)?min:f2;
    if(min!=poz){
        swap(pozh[heap[min]],pozh[heap[poz]]);
        swap(heap[min],heap[poz]);
        downheap(min);
    }
}
int extractMin(){
    int min = heap[1];
    pozh[heap[1]]=0;
    pozh[heap[dim]]=1;
    heap[1] = heap[dim];
    dim--;
    downheap(1);
    return min;
}

void dijkstra(){
    int cur;
    while(dim){
        cur = extractMin();
        list* p = graf[cur];
        if(dist[cur]==MAXINT) continue;
        while(p){
            if(dist[p->b] > p->c + dist[cur]){
                dist[p->b] = p->c + dist[cur];
                upheap(pozh[p->b]);
            }
            p = p->next;
        }
        viz[cur]=true;
    }
}

int main(){
    FILE *f = fopen("dijkstra.in", "r");
    fscanf(f, "%d %d", &n, &m);
    for(int i=2;i <= n;i++) dist[i] = MAXINT;
    for(int i=0; i<m; i++){
        int a,b,c;
        fscanf(f, "%d %d %d", &a,&b,&c);
        if(a==1) dist[b] = c;
        add(a,b,c);
    }
    for(int i=2;i<=n;i++){
        heap[++dim] = i; pozh[i]=dim;
        upheap(dim);
    }
    fclose(f);

    dijkstra();

    FILE *g = fopen("dijkstra.out", "w");
    for(int i=2;i<=n;i++) fprintf(g, "%d ", dist[i]!=MAXINT?dist[i]:0);
    fclose(g);
    return 0;
}