Cod sursa(job #2950940)

Utilizator pifaDumitru Andrei Denis pifa Data 4 decembrie 2022 21:23:45
Problema Drumuri minime Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, m;

vector <pair <int, int>> g[1501];

int fre[1501], dist[1501], cnt[1501];

const int E = 2.71828182845904523536;

struct compara
{
    bool operator()(int l, int c)
    {
        return dist[l] > dist[c];
    }
};
const int mod = 104659;
priority_queue <int, vector <int>, compara> pq;

int ln(int n)
{
    return (int)(log2(n) / log2(E));
}

void dijkstra()
{
    while(!pq.empty())
    {
        int curent = pq.top();
        pq.pop();
        fre[curent] = 0;
        //out << curent << '\n';
        for(int i = 0; i < g[curent].size(); i++)
        {

            int vecin = g[curent][i].first;
            int cost = g[curent][i].second;
            if((dist[curent] + ln(cost)) % mod == dist[vecin])
            {
                cnt[vecin] += cnt[curent];
            }
            if((dist[curent] + ln(cost)) % mod  < dist[vecin])
            {
                dist[vecin] = (dist[curent] + ln(cost)) % mod;
                cnt[vecin] = cnt[curent];
                if(fre[vecin] == 0)
                {
                    pq.push(vecin);
                    fre[vecin] = 1;
                }
            }
        }
    }
}

signed main()
{
    in >> n >> m;
    for(int i = 1; i <= m; i++)
    {
        int x, y, cost;
        in >> x >> y >> cost;
        g[x].push_back({y, cost});
        g[y].push_back({x, cost});
    }
     for(int i = 1; i <= n; i++)
    {
        dist[i] = INT_MAX;
    }
    dist[1] = 1;
    pq.push(1);
    fre[1] = 1;
    cnt[1] = 1;
    dijkstra();
    for(int i = 2; i <= n; i++)
        out << cnt[i] << ' ';
    return 0;
}