Pagini recente » Cod sursa (job #1138303) | Cod sursa (job #1130868) | Cod sursa (job #2114614) | Cod sursa (job #2097266) | Cod sursa (job #1880572)
#include <fstream>
#include <vector>
#include <queue>
#include <utility>
#include <cmath>
#define NMAX 1600
#define MOD 104659
#define PHI 1e-8
#define INF 1e40
#define mp make_pair
using namespace std ;
ofstream fout ( "dmin.out" ) ;
int N , M , dmin[NMAX] ;
double dist[NMAX] ;
vector < pair < int , double > > TT[NMAX] ;
queue < int > Q ;
bool vis[NMAX] ;
void read()
{
int x , y , cost ;
freopen ( "dmin.in" , "r" , stdin ) ;
scanf ( "%d %d" , &N , &M ) ;
for ( int i = 1 ; i <= M ; i++ )
{
scanf ( "%d %d %d" , &x , &y , &cost ) ; // logaritmam costul pentru a nu lucra cu numere mari si pentru ca log(a*b) = log a + log b
TT[x].push_back( mp( y , log(cost) ) ) ;
TT[y].push_back( mp( x , log(cost) ) ) ;
}
for ( int i = 2 ; i <= N ; i++ )
dist[i] = INF ;
}
void bellman_ford()
{
dmin[1] = 1 ;
vis[1] = 1 ;
dist[1] = 0 ;
Q.push(1) ;
while ( !Q.empty() )
{
int node = Q.front() ;
double distance = dist[node] ;
Q.pop() ;
vis[node] = 0 ;
for ( vector < pair < int , double > > :: iterator it = TT[node].begin() ; it != TT[node].end() ; it++ )
{
if ( distance + it->second - dist[it->first] > PHI )
continue ;
if ( distance + it->second - dist[it->first] == 0.0 )
dmin[it->first] = ( dmin[node] + dmin[it->first] ) % MOD ;
else
if ( distance + it->second - dist[it->first] < PHI )
{
dist[it->first] = distance + it->second ;
dmin[it->first] = dmin[node] ;
if ( !vis[it->first] )
{
vis[it->first] = 0 ;
Q.push(it->first) ;
}
}
}
}
for ( int i = 2 ; i <= N ; i++ )
fout << dmin[i] << ' ' ;
}
int main()
{
read() ;
bellman_ford() ;
return 0;
}