Cod sursa(job #2508179)

Utilizator bluestorm57Vasile T bluestorm57 Data 11 decembrie 2019 18:21:24
Problema Drumuri minime Scor 5
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMAX = 1505;
const int mod = 104659;
const double inf = DBL_MAX / 2;
int n,m,viz[NMAX],ans[NMAX];
double dist[NMAX];
vector < pair < int, double > > v[NMAX];
priority_queue < pair < double, int > > q;

int main(){
    int i,x,y,node;
    double z,cost,value;
    f >> n >> m;
    for(i = 1 ; i <= m ; i++){
        f >> x >> y >> z;
        z = log(z);
        v[x].push_back(make_pair(y,z));
        v[y].push_back(make_pair(x,z));
    }

    for(i = 2 ; i <= n ; i++)
        dist[i] = inf;
    ans[1] = 1;

    q.push(make_pair(0, 1));
    while(!q.empty()){
        node = q.top().second;
        cost = -q.top().first;
        q.pop();

        if(viz[node])
            continue;
        viz[node] = 1;

        for(auto it: v[node]){
            value = dist[node] + it.second;
            if(dist[it.first] > value){
                dist[it.first] = value;
                ans[it.first] = ans[node];
                q.push(make_pair(-value, it.first));
            }else
                if(dist[it.first] == value){
                    ans[it.first] = (ans[it.first] + ans[node]) % mod;
                }
        }
    }

    for(i = 2 ; i <= n ; i++)
        g << ans[i] << " ";

    return 0;
}