Pagini recente » Cod sursa (job #2868409) | Cod sursa (job #2093223) | Cod sursa (job #409960) | Cod sursa (job #1127538) | Cod sursa (job #1707110)
# 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] )
{
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;
}