Cod sursa(job #3271691)

Utilizator mariusharabariMarius Harabari mariusharabari Data 26 ianuarie 2025 22:39:23
Problema Drumuri minime Scor 25
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <bits/stdc++.h>
using namespace std;

const int MOD = 104659;
const int NMAX = 1505;
const double INF = 1e18;

int n, m;
vector<pair<int, double>> adj[NMAX]; // Adjacency list (node, log(cost))
double dist[NMAX];                  // Logarithmic distances
int ways[NMAX];                     // Number of distinct shortest paths modulo MOD

void dijkstra(int source) {
    priority_queue<pair<double, int>, vector<pair<double, int>>, greater<pair<double, int>>> pq;
    fill(dist, dist + n + 1, INF); // Initialize distances to infinity
    fill(ways, ways + n + 1, 0);  // Initialize ways to 0

    dist[source] = 0.0; // Distance to source is 0
    ways[source] = 1;   // One way to reach the source
    pq.push({0.0, source});

    while (!pq.empty()) {
        auto [current_dist, u] = pq.top();
        pq.pop();

        if (current_dist > dist[u]) continue;

        for (auto [v, weight_log] : adj[u]) {
            double new_dist = dist[u] + weight_log;

            if (new_dist < dist[v]) { // Found a better distance
                dist[v] = new_dist;
                ways[v] = ways[u];
                pq.push({new_dist, v});
            } else if (abs(new_dist - dist[v]) < 1e-9) { // Same distance
                ways[v] = (ways[v] + ways[u]) % MOD;
            }
        }
    }
}

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

    fin >> n >> m;
    for (int i = 0; i < m; i++) {
        int u, v, c;
        fin >> u >> v >> c;
        double log_cost = log(c);
        adj[u].emplace_back(v, log_cost);
        adj[v].emplace_back(u, log_cost); // Add edge (undirected graph)
    }

    dijkstra(1); // Run Dijkstra from node 1

    for (int i = 2; i <= n; i++) {
        fout << ways[i] << " ";
    }

    fin.close();
    fout.close();
    return 0;
}