Cod sursa(job #1810099)

Utilizator radu.leonardoThe Doctor radu.leonardo Data 19 noiembrie 2016 16:36:31
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.84 kb
#include <stdio.h>
#include <vector>
#include <algorithm>

using namespace std;

const int oo = 1<<30;
#define buff_size 104576
char buff[buff_size];
int pos=0;

inline void cit(int &nr)
{
    while(!isdigit(buff[pos])) if(++pos == buff_size) fread(buff,  1,buff_size, stdin), pos = 0;
    nr = 0;
    while(isdigit(buff[pos]))
    {
        nr = (nr<<1)+(nr<<3)+ buff[pos] - 48;
        if(++pos == buff_size) fread(buff, 1, buff_size, stdin), pos = 0;
    }
}

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

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

void read()
{
    //freopen("bellmanford.in","r",stdin);

    for(int i=1;i<=m;++i) cit(a[i].x), cit(a[i].y), cit(a[i].c);

}

//bool viz[50001]={false};

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) printf("0 ");
                 else printf("%d ", 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);
    cit(n);cit(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++)
    {

        cit(a), cit(b), cit(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)
            printf("0 ");
        else printf("%d ", sol[i]);
    }
    else{
    read();
    bell();}
    return 0;
}