Cod sursa(job #1522714)

Utilizator DobosDobos Paul Dobos Data 11 noiembrie 2015 22:09:15
Problema Drumuri minime Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin ("dmin.in");
ofstream fout ("dmin.out");
const int MOD = 104659;
const int MAX = 1505;
const int INF = 1e9;
const double eps = 1e-6;
set < pair <double,int> > T;
vector < pair <double,int> > G[MAX];
struct fac{
int a;
bool v;
double d;
}D[MAX];
inline int mod(double x){
return max(x,-x);
}
inline int solve()
{
    int nod;
    T.insert({0,1});
    while(!T.empty()){
        nod = (*T.begin()).second;
        T.erase(*T.begin());
        for(int i = 0; i < G[nod].size(); i++){
            if(D[G[nod][i].second].d > D[nod].d + G[nod][i].first){
                D[G[nod][i].second].d  = D[nod].d + G[nod][i].first;
                T.insert({D[G[nod][i].second].d,G[nod][i].second});
            }
        }
    }
}
int dmin(int nod)
{
    if(D[nod].v) return D[nod].a;
    D[nod].v = 1;
    for(int i = 0; i < G[nod].size(); i++){
        if(mod(D[G[nod][i].second].d  - D[nod].d + G[nod][i].first) < eps ){
            D[nod].a += dmin(G[nod][i].second);
            D[nod].a %= MOD;
        }

    }
    return D[nod].a;
}
int main()
{
    int n,m,x,y,c;
    fin >> n >> m;
    for(int i = 1; i <= m; i++){
        fin >> x >> y >> c;
        G[x].push_back({log(c),y});
        G[y].push_back({log(c),x});
    }
    for(int i = 2; i <= n; i++)
        D[i].d = INF;
    solve();
    D[1].a = 1;
    D[1].v = 1;
    for(int i = 2; i <= n; i++)
        fout << dmin(i) << " ";
    return 0;
}