Cod sursa(job #1796765)

Utilizator Emil64Emil Centiu Emil64 Data 3 noiembrie 2016 19:08:23
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.92 kb
#include <stdio.h>
#include <vector>
#include <algorithm>

#define infinit 2000000

using namespace std;

struct _arc
{
    int cost, destinatie;
} arc;
struct nod
{
    vector<_arc> v;
} v[50001];

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

vector<_arc> h;
bool viz[50001];
int sol[50001];


char buff[20000];int pos=0;
FILE*f=freopen("dijkstra.in","r",stdin);
FILE*g=freopen("dijkstra.out","w",stdout);
inline void read(int &nr){
    while(buff[pos] < '0' || buff[pos] > '9')if(++pos == 20000) fread(buff, 1, 20000, stdin), pos = 0;
    nr = 0;
    while('0' <= buff[pos] && buff[pos] <= '9') {nr = nr * 10 + buff[pos] - '0';if(++pos == 20000) fread(buff, 1, 20000, stdin), pos = 0;}
}

int main()
{

    int i, j, n, m, a, b, c;
    read(n), read(m);
    for(i=1; i<=n; i++)
        sol[i] = infinit;
    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] = infinit;
    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] == infinit)
            printf("0 ");
        else printf("%d ", sol[i]);
}