Cod sursa(job #1854257)

Utilizator horiacoolNedelcu Horia Alexandru horiacool Data 22 ianuarie 2017 15:24:46
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 3.09 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("dijkstra.in");
ofstream g("dijkstra.out");

#define inf 99999
struct graf
{
    int info,cost;
    graf* urm;
}*pt[50001];
int N,M,h,heap[50001],poz[50001],val[50001];

void InserareGraf(graf* &point,int val,int ct)
{
   graf* cap = new graf;
   cap->info = val;
   cap->cost = ct;
   cap->urm = point;
   point = cap;
}

inline int father(int nod) {
    return nod / 2;
}
inline int left_son(int nod) {
    return nod * 2;
}
inline int right_son(int nod) {
    return nod * 2 + 1;
}

void swap_nod(int x,int y)
{
    swap( heap[poz[x]],heap[poz[y]] );
    swap( poz[x],poz[y] );
}

void up(int nod)
{
     int ok = 0;

     while( nod > 1 && ok == 0 )
     {
        if( val[ heap[ nod ] ] >= val[ heap[ father(nod) ] ] )
            ok = 1;
        else
        {
            swap_nod( heap[ nod ],heap[ father(nod) ] );
            nod = father(nod);
        }
     }
}

void down(int nod)
{
    int ok = 0;

    while( nod * 2 <= h && ok == 0 )
    {
        if( val[ heap[ nod ] ] <= val[ heap[ left_son(nod) ] ] && val[ heap[ nod ] ] <= val[ heap[ right_son(nod) ] ] )
            ok = 1;
        else
        if( val[ heap[ nod ] ] <= val[ heap[ left_son(nod) ] ] && right_son(nod) > h  )
            ok = 1;
        else
        {
            if( val[ heap[ nod ] ] > val[ heap[ left_son(nod) ] ] && ( val[ heap[ left_son(nod) ] ] <= val[ heap[ right_son(nod) ] ] || right_son(nod) > h ) )
            {
                swap_nod( heap[ nod ],heap[ left_son(nod) ] );
                nod = left_son(nod);
            }
            else
            if( val[ heap[ nod ] ] > val[ heap[ right_son(nod) ] ] && val[ heap[ left_son(nod) ] ] >= val[ heap[ right_son(nod) ] ] )
            {
                swap_nod( heap[ nod ],heap[ right_son(nod) ] );
                nod = right_son(nod);
            }
        }
    }
}

void Eliminare(int nod)
{
    int aux = heap[h];
    poz[ aux ] = poz[ nod ];
    heap[ poz[ nod ] ] = aux;
    poz[ nod ] = 0;
    heap[h] = 0;
    h--;

    up( poz[ aux ] );
    down( poz[ aux ] );
}

void dijkstra(int xp)
{
    int u;
    for(int i = 1 ; i <= N ; i++)
    {
        val[i] = inf;
        heap[i] = i;
        poz[i] = i;
    }
    h = N;
    val[xp] = 0;
    swap_nod(xp,heap[1]);

    while( h!=0 )
    {
        u = heap[1];
        Eliminare(u);

        graf* cap = pt[u];

        while( cap != NULL )
        {
            int y = cap->info;
            int ct = cap->cost;

            if( val[y] > val[u] + ct )
            {
                val[y] = val[u] + ct;
                //tata[y] = u;
                up(poz[y]);
            }

            cap = cap->urm;
        }
    }
}

int main()
{
    int a,b,c;
    f>>N>>M;
    for(int i = 1 ; i <= N ; i++)
        pt[i] = NULL;

    for(int i=1 ; i <= M ; i++)
    {
        f>>a>>b>>c;
        InserareGraf(pt[a],b,c);
        InserareGraf(pt[b],a,c);
    }

    dijkstra(1);
    for(int i = 2 ; i <= N ; i++)
        g<<val[i]<<' ';
}