Cod sursa(job #2302171)

Utilizator DenisONIcBanu Denis Andrei DenisONIc Data 13 decembrie 2018 21:38:04
Problema Drumuri minime Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <bits/stdc++.h>
#define Nmax 2505
#define pii pair<int,int>
#define eps 0.00000001
#define MOD 104659
using namespace std;

int n,m,nr[Nmax],a,b,c;
long double mn[Nmax];

vector<pii> v[Nmax];
vector<int> H;

bool comp(int a,int b){
    return mn[a] > mn[b];
}

int main()
{
    freopen("dmin.in","r",stdin);
    freopen("dmin.out","w",stdout);
    cin >> n >> m;
    for (int i=1;i<=m;i++){
        cin >> a >> b >> c;
        v[a].push_back({b,c});
        v[b].push_back({a,c});
    }

    H.push_back(1);
    mn[1] = 1;
    nr[1] = 1;
    while (!H.empty()){
        int nod = H[0];
        pop_heap(H.begin(),H.end(),comp);
        H.pop_back();

        for (auto it : v[nod]){
            if (abs(mn[it.first])<eps){
                mn[it.first] = mn[nod] * it.second;
                nr[it.first] = nr[nod];
                H.push_back(it.first);
            }
            else if (abs(mn[it.first] - mn[nod] * it.second) < eps){
                nr[it.first] += nr[nod];
                if (nr[it.first] >= MOD)
                    nr[it.first] -= MOD;
            }
        }
    }

    for (int i=2;i<=n;i++) cout << nr[i] << ' ';


    return 0;
}