Cod sursa(job #1865155)

Utilizator robx12lnLinca Robert robx12ln Data 1 februarie 2017 14:37:26
Problema Drumuri minime Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include<fstream>
#include<vector>
#include<cmath>
#include<cstring>
#include<queue>
#define MOD 104659
#define EPS 0.0000001
#define INF 2000000000.0
using namespace std;
ifstream fin("dmin.in");
ofstream fout("dmin.out");
int n, m, a, b, c, f[1005];
vector< pair<int, double> > v[1505];
pair<double,int> d[1005];
queue<int> q;
int main(){
    fin >> n >> m;
    for( int i = 1; i <= m; i++ ){
        fin >> a >> b >> c;
        v[a].push_back( make_pair( b, log(c) ) );
        v[b].push_back( make_pair( a, log(c) ) );
    }
    q.push( 1 );
    for( int i = 1; i <= n; i++ ){
        d[i].first = INF;
    }
    d[1].first = 0.0;
    d[1].second = 1;
    while( !q.empty() ){
        f[q.front()] = 1;
        int nod = q.front();
        for( int i = 0; i < v[nod].size(); i++ ){
            int vecin = v[nod][i].first;
            if( d[vecin].first - (d[nod].first + v[nod][i].second) > EPS ){
                d[vecin].first = d[nod].first + v[nod][i].second;
                d[vecin].second = d[nod].second;
                if( f[vecin] == 0 )
                    q.push( vecin );
                f[vecin] = 1;
            }else{
                if( d[vecin].first - (d[nod].first + v[nod][i].second) <= EPS && d[vecin].first - (d[nod].first + v[nod][i].second) >= -EPS ){
                    d[vecin].second += d[nod].second;
                    f[vecin] = 1;
                    if( f[vecin] == 0 )
                        q.push( vecin );
                    f[vecin] = 1;
                }
            }
        }
        f[nod] = 0;
        q.pop();
    }
    for( int i = 2; i <= n; i++ ){
        fout << d[i].second << " ";
    }
    return 0;
}