Cod sursa(job #1246385)

Utilizator japjappedulapPotra Vlad japjappedulap Data 21 octombrie 2014 00:08:07
Problema Drumuri minime Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <fstream>
#include <vector>
#include <queue>
using namespace std;

#define MOD 104659

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

int N, M, D[1505], Nr[1505];
vector <pair<int,int> > v[1505];

struct CMP{ bool operator ()(int a, int b){   return D[a] > D[b]; }};
priority_queue <int, vector<int>, CMP> Q;

int main()
{
    is >> N >> M;
    for (int i = 2; i <= N; ++i)
        D[i] = (1<<30);
    for (int i = 1, a, b, c; i <= M; ++i)
        is >> a >> b >> c, v[a].push_back({b,c}), v[b].push_back({a,c});
    Q.push(1);
    Nr[1] = 1;
    for (int i, nod, cost; !Q.empty(); )
    {
        i = Q.top();
        Q.pop();
        for (int j = 0; j < v[i].size(); ++j)
        {
            nod = v[i][j].first;
            cost = v[i][j].second;
            if (D[nod] > D[i] + cost)
            {
                Nr[nod] = 0;
                D[nod] = D[i] + cost;
                Q.push(nod);
            }
            if (D[nod] == D[i] + cost)
                Nr[nod] = (Nr[nod] + Nr[i]) % MOD;
        }
    }

    for (int i = 2; i <= N; ++i)
        os << Nr[i] << ' ';

    is.close();
    os.close();
}