Cod sursa(job #2572769)

Utilizator vlad082002Ciocoiu Vlad vlad082002 Data 5 martie 2020 14:13:53
Problema Drumuri minime Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <fstream>
#include <queue>
#include <vector>
#include <algorithm>
#include <climits>
#include <iostream>
#include <cmath>
#include <limits>
using namespace std;

ifstream fin("dmin.in");
ofstream fout("dmin.out");

const int mod = 104659;
vector<pair<int, double> > g[1505];
int n, m;
double dist[1505];
int nrDrumuri[1505];
bool v[1505];

void citire() {
    fin >> n >> m;
    int a, b;
    double c;
    while(m--) {
        fin >> a >> b >> c;
        g[a].push_back({b,log(c)});
        g[b].push_back({a,log(c)});
    }
}

void dfs(int x) {
    v[x] = 1;
    for(auto next: g[x])
        if(abs(dist[next.first]+next.second - dist[x]) < 1e-8) {
            if(!v[next.first])
                dfs(next.first);
            nrDrumuri[x] = (nrDrumuri[x] + nrDrumuri[next.first])%mod;
        }
}

void solve() {
    priority_queue<pair<double, int > > q;
    q.push({0, 1});
    for(int i = 1; i <= n; i++)
        dist[i] = 1000000000.0;
    dist[1] = 0.0;
    while(!q.empty()) {
        int curr = q.top().second;
        q.pop();

        for(auto next: g[curr]) {
            if(dist[next.first] - (dist[curr]+next.second) > 1e-8) {
                dist[next.first] = dist[curr]+next.second;
                q.push({-dist[next.first], next.first});
            }
        }
    }
    nrDrumuri[1] = 1;
    for(int i = 1; i <= n; i++)
        if(!v[i])
            dfs(i);
    for(int i = 2; i <= n; i++)
        fout << nrDrumuri[i] << '\n';
}

int main() {
    citire();
    solve();
}