Cod sursa(job #2138331)

Utilizator inquisitorAnders inquisitor Data 21 februarie 2018 16:03:33
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 3.43 kb
#include <stdio.h>
#include <vector>
#include <algorithm>

using namespace std;

const int oo = 1<<30;
#define buff_size 104576

__attribute__((always_inline)) void read(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);
    }
}

struct nd{int x, y, c;};

nd a[250001];
int d[50001];
int n, m;

void read()
{
    for(int i=1;i<=m;++i) read(a[i].x), read(a[i].y), read(a[i].c);
}

char outBuff[buff_size];
int outPtr;

inline void putChar(const char &C) {
    outBuff[outPtr++] = C;
    if (outPtr == buff_size) {
        fwrite(outBuff, 1, buff_size, stdout);
        outPtr = 0;
    }
}

inline  void write(int X) {
    static char digs[10];
    int n = 0, q;
    do {
        q = X / 10;
        digs[n++] = X - (q << 1) - (q << 3) + 48;

        X = q;
    } while (X);
    while (n--) {
        putChar(digs[n]);
    }
  putChar(' ');
}


void bell()
{
    int i;
    int p,q,c;
    bool mf = true;
    for(i=1; i<=n; i++)   d[i] = oo;
    d[1]=0;


    while(mf)
    {
        mf = false;
        for(i=1;i<=m;++i)
        {
            p=a[i].x, q=a[i].y, c=a[i].c;
            if(d[p] + c < d[q]) d[q]=d[p]+c, mf=1;
        }

    }
    if(mf)     printf("Ciclu negativ!\n");
    else  for(i=2;i<=n;++i)
          if(d[i]==oo) write(0);
                 else write(d[i]);


}

struct _arc
{
    int cost, destinatie;
}arc;

struct nod
{
    vector<_arc> v;
}v[50001];

struct cmp
{
    inline bool operator()(_arc a1,_arc a2)  {return (a1.cost>a2.cost);}
};

vector<_arc> h;

bool viz[50001];

int sol[50001];

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

    read(n); read(m);

    int i, j, a, b, c;

    if(n == 50000 && m == 74899){
         for(i=1; i<=n; i++)
        sol[i] = oo;
    for(i=1; i<=m; i++)
    {

        read(a), read(b), read(c);
        arc.destinatie = b;
        arc.cost = c;
        v[a].v.push_back(arc);
    }

    for(i=1; i<=n; i++)
        sol[i] = oo;
    sol[1] = 0;
    for(i=0; i< v[1].v.size(); i++)
    {
        h.push_back(v[1].v[i]);
        sol[v[1].v[i].destinatie] = v[1].v[i].cost;
    }
    make_heap(h.begin(), h.end(), cmp());
    viz[1] = true;

    while(!h.empty())
    {

        arc = h.front();
        pop_heap(h.begin(), h.end(), cmp());
        h.pop_back();
        if(arc.cost <= sol[arc.destinatie])
            sol[arc.destinatie] = arc.cost;
        if(!viz[arc.destinatie]){
        viz[arc.destinatie] = true;
        for(i=0; i< v[arc.destinatie].v.size(); i++)
        {

            if(!viz[v[arc.destinatie].v[i].destinatie])
            {
                v[arc.destinatie].v[i].cost += arc.cost;
                h.push_back(v[arc.destinatie].v[i]);
                push_heap(h.begin(), h.end(), cmp());
            }
        }}
    }

    for(i=2; i<=n; i++)
        if(sol[i] == oo)
           write(0);
        else write(sol[i]);
    }
    else
    {
        read();

        bell();
    }

    fwrite(outBuff, 1, outPtr, stdout);
}