Cod sursa(job #1178311)

Utilizator rogoz.bogdanRogoz Bogdan rogoz.bogdan Data 26 aprilie 2014 14:50:40
Problema Algoritmul lui Dijkstra Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 2.14 kb
//comparare Dijkstra cu/fara priority_queue STL (varianta fara)
#include <fstream>
#include <vector>
#define MX 50001
#define NUMAR 2000000000
using namespace std;

ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");
int n,m;

struct vecin
{
    int j,c;
};
vector<vecin> v[MX];
vector<int> p;
int np,viz[MX],d[MX];

void citire()
{
    int i,a,b,c;
    vecin e;
    fin>>n>>m;
    for(i=1; i<=m; i++)
    {
        fin>>a>>b>>c;
        e.j = b;
        e.c = c;
        v[a].push_back(e);
    }
}

void reconstituie(int i)
{
    int minim,aux;
    minim = i;

    if(2*i <= np)
    {
        if(d[p[2*i]] < d[p[minim]]) minim = 2*i;
    }
    if(2*i+1 <= np)
    {
        if(d[p[2*i+1]] < d[p[minim]]) minim = 2*i+1;
    }

    if(minim != i)
    {
        aux = p[i];
        p[i] = p[minim];
        p[minim] = aux;
        reconstituie(minim);
    }
}

void PUSH(int x)
{
    np++;
    p.push_back(NUMAR);
    int mn=np;
    while(mn>1 && d[p[mn/2]]>d[x])
    {
        p[mn] = p[mn/2];
        mn /= 2;
    }
    p[mn] = x;
}

int TOP()
{
    return p[1];
}

void POP()
{
    int aux;
    aux = p[1];
    p[1] = p[np];
    p[np] = aux;
    np--;
    p.pop_back();
    reconstituie(1);
}

void Dijkstra()
{
    int i,u,r;
    vecin e;
    vector<vecin>::iterator it;

    for(i=1; i<=n; i++)
    {
        d[i] = NUMAR;
        //PUSH(i);
    }
    d[1] = 0;
    PUSH(1);

    while(np)
    {
        u = TOP();
        POP();
        if(viz[u] == 0)
        {
            for(it=v[u].begin(); it!=v[u].end(); it++)
            {
                e = *it;
                r = d[u]+e.c;
                if(r < d[e.j])
                {
                    d[e.j] = r;
                    PUSH(e.j);
                }
            }
            viz[u] = 1;
        }
    }
}

void afisare()
{
    int i;
    for(i=2; i<=n; i++)
    {
        if(d[i] == NUMAR) fout<<0<<' ';
        else fout<<d[i]<<' ';
    }
}

int main()
{
    citire();
    p.push_back(NUMAR);
    Dijkstra();
    afisare();

    fin.close(); fout.close();
    return 0;
}