Cod sursa(job #1322749)

Utilizator Toast97Calin Farcas Toast97 Data 20 ianuarie 2015 12:54:28
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <fstream>
#include <set>

using namespace std;

ifstream f ("dijkstra.in");
ofstream g ("dijkstra.out");

const int infinit = (1 << 31) - 1;

struct nod
{
    int info;
    int cost;
    nod *adr;
} *v[50005];

void adauga (int x, int y, int z)
{
    nod *c;
    c = new nod;
    c -> adr = v[x];
    c -> info = y;
    c -> cost = z;

    v[x] = c;
}

void sterge (int x)
{
    nod *p;
    p = v[x];
    v[x] = v[x] -> adr;
    delete p;
}

set < pair < int, int> > c;

int n, m, s[50005];

void citire ()
{
    f >> n >> m;

    int a, b, c;

    for (int i = 1; i <= n; i ++)
    {
        f >> a >> b >> c;
        adauga (a, b, c);
    }

    for (int i = 1; i <= n; i ++)
        s[i] = infinit;
}

void dijkstra ()
{
    c.insert (make_pair (0, 1));

    int cost_curent, nod_curent;
    nod *p;

    while (! c.empty ())
    {
        cost_curent = (*c.begin ()).first;
        nod_curent =  (*c.begin ()).second;

        c.erase (*c.begin());

        p = v[nod_curent];

        while (p)
        {
            if (cost_curent + p -> cost < s[p -> info])
            {
                c.insert (make_pair (cost_curent + p -> cost, p -> info));
                s [p -> info] = cost_curent + p -> cost;
            }

            p = p -> adr;
        }
    }
}

void afisare ()
{
    for (int i = 2; i <= n; i ++)
        {
            if (s[i] == infinit)
                g << 0;
            else
                g << s[i];

            g << " ";
        }
}

int main()
{
    citire ();
    dijkstra ();
    afisare ();

    f.close ();
    g.close ();
    return 0;
}