Cod sursa(job #1707109)

Utilizator Mr.RobotElliot Alderson Mr.Robot Data 24 mai 2016 11:05:17
Problema Drumuri minime Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
# include <iostream>
# include <fstream>
# include <vector>
# include <algorithm>
# include <cmath>
# include <limits>


using namespace std;

#define MA numeric_limits<double>::max()
#define pla 0.0000000001

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

int n, m, x, y, c, nr[1502];
double d, dist[1502];
vector < pair < int, double > > l[1502];
vector < pair < double, int > > h;


int main()
{
    f >> n >> m;
    for( int i = 1; i <= m; ++ i )
    {
         f >> x >> y >> c;
         d = log( c );
         l[x].push_back( make_pair( y, d ) );
         l[y].push_back( make_pair( x, d ) );
    }

    for( int i = 1; i <= n; ++ i )
        dist[i] = MA;

    h.push_back( make_pair( 0, 1 ) );
    make_heap( h.begin(), h.end() );
    dist[1] = 0;
    nr[1] = 1;

    while( !h.empty() )
    {
        pop_heap( h.begin(), h.end() );
        x = h.back().second;
        d = -(h.back().first);
        h.pop_back();

        for( vector < pair < int, double > > :: iterator it = l[x].begin(); it != l[x].end(); ++ it )
        {
            double distanta  = d + it->second;

            if( distanta < dist[it->first] - pla )
            {

                dist[it->first] = distanta;
                h.push_back( make_pair( -distanta, it->first ));
                push_heap( h.begin(), h.end() );
                nr[it->first] = nr[x];
            }
            else if( fabs( distanta - dist[it->first]) < pla )
            {
                nr[it->first] += nr[x];
            }
        }
    }

    for( int i = 2; i <=n; ++ i )
        g << nr[i] << " ";
    return 0;
}