Cod sursa(job #2215124)

Utilizator ShutterflyFilip A Shutterfly Data 21 iunie 2018 04:51:42
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 4.96 kb
#include <bits/stdc++.h>
#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];
char buf_mic[20];
int inHeap[50001];
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);
}

///OPEN SOURCE BABY
__attribute__((always_inline)) void reader (int &num)
{
    static char inBuffer[0x30D40];

    static unsigned int p = 0x30D3F; num = 0x0;

    while(inBuffer[p] < 0x30 | inBuffer[p] > 0x39)
    {
        ++p != 0x30D40 || (fread(inBuffer, 0x1, 0x30D40, stdin), p = 0x0);
    }

    while(inBuffer[p] > 0x2F & inBuffer[p] < 0x3A)
    {
        num = num * 0xA + inBuffer[p] - 0x30;

        ++p != 0x30D40 || (fread(inBuffer, 0x1, 0x30D40, stdin), p = 0x0);
    }
}

char outBuffer[0x61A80]; unsigned int p;

__attribute__((always_inline)) void writer (unsigned int x)
{
    unsigned int digits = x > 0x3B9AC9FF ? 0xA :
                 x > 0x5F5E0FF  ? 0x9 :
                 x > 0x98967F   ? 0x8 :
                 x > 0xF423F    ? 0x7 :
                 x > 0x1869F    ? 0x6 :
                 x > 0x270F     ? 0x5 :
                 x > 0x3E7      ? 0x4 :
                 x > 0x63       ? 0x3 :
                 x > 0x9        ? 0x2 : 0x1;

    for(unsigned int i = ~-digits; ~i; --i)
    {
        outBuffer[p + i] = x % 0xA + 0x30;

        x = x / 0xA;
    }

    p = p + digits; outBuffer[p++] = 0x20;
}

int main () {
    freopen("dijkstra.in", "r", stdin);
    freopen("dijkstra.out", "w", stdout);

    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);
    }
    puts(outBuffer);
    return 0;
}