Cod sursa(job #2426438)

Utilizator vmnechitaNechita Vlad-Mihai vmnechita Data 27 mai 2019 22:50:44
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.17 kb
#include <fstream>
#include <map>
#include <iterator>

using namespace std;

ifstream fin ("dijkstra.in");
ofstream fout ("dijkstra.out");

multimap < int, int > a[50001];
multimap < int, int > :: iterator it, itt, poz;

int n, m, p, x, y, c, i, j, minn;
int P[50001], v[50001];
bool ok, fr[50001];

int main()
{
    fin >> n >> m;
    p = 1;
    for ( i = 1 ; i <= m ; i++ )
    {
        fin >> x >> y >> c;
        a[x].insert ( pair < int, int > ( c, y ) );
        a[y].insert ( pair < int, int > ( c, x ) );

        if ( x == p ) P[y] = c;
        if ( y == p ) P[x] = c;
    }

    fr[p] = 1;
    while ( a[p].empty() == 0 )
    {
        minn = a[p].begin() -> first;
        i = a[p].begin() -> second;
        a[p].erase ( a[p].begin() );
        P[i] = 0;
        fr[i] = 1;

        if ( v[i] == 0 ) v[i] = minn;
        else if ( minn < v[i] ) v[i] = minn;

        while ( a[i].empty() == 0 )
        {
            it = a[i].begin();
            if ( fr[it -> second] == 0 )
            {
                if ( P[ it -> second ] != 0  )
                {
                    if ( minn + it -> first < P[ it -> second ] )
                    {
                        poz = a[p].find ( it -> second );
                        for ( itt = poz ; itt != a[p].end() ; itt++ )
                            if ( itt -> second == it -> second )
                            {
                                a[p].erase( itt );
                                a[p].insert ( pair < int, int > ( minn + it -> first, it -> second ) );
                                P[ it -> second ] = minn + it -> first;
                                break;
                            }
                    }
                }

                else
                {
                    a[p].insert ( pair < int, int > ( minn + it -> first, it -> second ) );
                    P[ it -> second ] = minn + it -> first;
                }
            }

            a[i].erase ( it );
        }
    }

    for ( i = 1 ; i <= n ; i++ )
    {
        if ( v[i] == 0 && i != p ) fout << -1 << ' ';
        else fout << v[i] << ' ';
    }

    return 0;
}