Cod sursa(job #2215115)

Utilizator ShutterflyFilip A Shutterfly Data 21 iunie 2018 04:03:23
Problema Algoritmul lui Dijkstra Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 4.88 kb
#include <stdio.h>
#include <string.h>

#define MASK 131071

///implementare interactiva 2.0.0

struct NodeData {
    int Nod;
    int Path;
} heap[50001];

struct Muchie {
    int Vec;
    int Cost;
} muchii[250001];

int nod[50001], prevy[250001];

int inHeap[50001];
int output[50001];
char buff[MASK];
char outbuff[MASK];
int pos;
int outpos;
FILE *fin;
FILE *fout;

int poz[50001];
int heaplevel;
int heapsize;

inline void add(struct NodeData val);
inline void rmv(int nod);
inline void coborare(int nod);
inline void urcare(int nod);
inline void swap_nodes(int nod1,int nod2);
inline void swapu(int* a,int* b)
{
    int man = *a;
    *a=*b;
    *b=man;
}

inline void add(struct NodeData val) {
    heap[++heapsize].Nod = val.Nod;
    heap[heapsize].Path = val.Path;
    inHeap[val.Nod] = heapsize;
    urcare(heapsize);
}

inline void rmv(int nod) {
    swap_nodes(nod, heapsize);
    heapsize--;
    coborare(nod);
    urcare(nod);
}

inline void coborare(int nod) {
    /*while ((heap[nod].Path > heap[nod * 2].Path || heap[nod].Path > heap[nod * 2 + 1].Path) && nod * 2 <= heapsize) {
        if (heap[nod * 2].Path < heap[nod * 2 + 1].Path) {
            swap_nodes(nod * 2, nod);
            nod = nod * 2;
        } else {
            swap_nodes(nod * 2 + 1, nod);
            nod = nod * 2 + 1;
        }
    }*/
    int son=0;
    do
    {
        son=0;
        if(2*nod+1 <= heapsize)
        {
            if(heap[2*nod].Path < heap[2*nod+1].Path)
            {
                son=2*nod;
            }
            else
            {
                son=2*nod+1;
            }
        }
        else if(2*nod<=heapsize)
        {
            son=2*nod;
        }

        if(heap[nod].Path <= heap[son].Path)
        {
            son=0;
        }
        if(son)
        {
            swap_nodes(nod,son);
            nod=son;
        }
    }while(son);
}

inline void urcare(int nod) {
    while (heap[nod].Path < heap[nod / 2].Path && nod > 1) {
        swap_nodes(nod / 2, nod);
        nod = nod / 2;
    }
}

inline void swap_nodes(int nod1,int nod2) {
    swapu(&inHeap[heap[nod1].Nod], &inHeap[heap[nod2].Nod]);
    swapu(&heap[nod1].Path, &heap[nod2].Path);
    swapu(&heap[nod1].Nod, &heap[nod2].Nod);
}

inline void reader (int* nr) {
    while(buff[pos] < '0' || buff[pos] > '9') {
        pos++;
        if (pos == MASK) {
            fread (buff, 1, MASK, fin);
            pos = 0;
        }
    }

    int temp = 0;
    while (buff[pos] >= '0' && buff[pos] <= '9') {
        temp = temp * 10 + (buff[pos] - '0');
        pos++;
        if (pos == MASK) {
            fread (buff, 1, MASK, fin);
            pos = 0;
        }
    }

    *nr = temp;
}
inline void writer (int nr) {
    int powerer = 1;
    int temp = nr;
    while (powerer <= temp) {
        powerer *= 10;
    }
    powerer /= 10;
    do {
        outbuff[outpos++] = (nr/powerer) % 10 + '0';
        nr %= powerer;
        powerer /= 10;
        if (outpos == MASK) {
            fwrite (outbuff, 1, MASK, fout);
            outpos = 0;
        }
    } while (nr);
    outbuff[outpos++] = ' ';
    if (outpos == MASK) {
        fwrite (outbuff, 1, MASK, fout);
        outpos = 0;
    }
}
int main () {
    fin = fopen("dijkstra.in", "r");
    fout = fopen("dijkstra.out", "w");

    fread (buff, 1, MASK, fin);

    int Noduri, Muchii;
    reader(&Noduri);
    reader(&Muchii);
    int i;
    for (i = 0; i < Muchii; i++) {
        int orig, dest, cost;
        reader(&orig);
        reader(&dest);
        reader(&cost);

        heaplevel++;
        prevy[heaplevel] = nod[orig];
        nod[orig] = heaplevel;

        struct Muchie Cobai;
        Cobai.Vec = dest;
        Cobai.Cost = cost;
        muchii[heaplevel] = Cobai;
    }

    struct NodeData Cobai;
    Cobai.Nod = 1;
    Cobai.Path = 0;
    add(Cobai);

    for (i = 2; i <= Noduri; i++) {
        struct NodeData Cobai;
        Cobai.Nod = i;
        Cobai.Path = 1000000000;
        add(Cobai);
    }

    ///ce-i dezastru' asta nuclear
    while (heapsize >= 1) {
        int curNod = heap[1].Nod;
        int ind = nod[heap[1].Nod];
        rmv(1);
        while (ind) {
            int vecin = muchii[ind].Vec;
            if (heap[inHeap[vecin]].Path > muchii[ind].Cost + heap[inHeap[curNod]].Path) {
                heap[inHeap[vecin]].Path = muchii[ind].Cost + heap[inHeap[curNod]].Path;
                coborare(inHeap[vecin]);
                urcare(inHeap[vecin]);
            }

            ind = prevy[ind];
        }
    }

    int destin;
    for (destin = 2; destin <= Noduri; destin++) {
        if (heap[inHeap[destin]].Path >= 1000000000)
            writer(0);
        else
            writer(heap[inHeap[destin]].Path);
    }

    fwrite (outbuff, 1, MASK, fout);
    return 0;
}