Cod sursa(job #1002214)

Utilizator cbanu96Banu Cristian cbanu96 Data 27 septembrie 2013 01:40:12
Problema Drumuri minime Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <cstdio>
#include <cmath>
#include <vector>
#include <queue>
#include <utility>

#define FILEIN  "dmin.in"
#define FILEOUT "dmin.out"

const long double EPS = 1e-8;
const int NMAX = 1505;

using namespace std;

long double D[NMAX];
int    P[NMAX];
int    T[NMAX];
vector<int>     A[NMAX];
vector<long double>  C[NMAX];
int N, M;
queue<pair<int, long double> > Q;

int comp(long double x, long double y) {
    double rez = x-y;
    if (rez < -EPS)
        return -1;
    if (rez > EPS)
        return 1;
    return 0;
}

void dijkstra() {
    D[1] = 0;
    for ( int i = 2; i <= N; i++) {
        D[i] = 250000;
    }
    Q.push(make_pair(1, (long double)0));
    while (!Q.empty()) {
        int idx; double dist;
        idx = Q.front().first;
        dist = Q.front().second;
        Q.pop();
        for ( int i = 0; i < A[idx].size(); i++) {
            if (comp(dist + C[idx][i], D[A[idx][i]]) < 0) {
                D[A[idx][i]] = C[idx][i] + dist;
                P[A[idx][i]] = 1;
                T[A[idx][i]] = idx;
                Q.push(make_pair(A[idx][i], D[A[idx][i]]));
            } else if (comp(dist + C[idx][i], D[A[idx][i]]) == 0) {
                P[A[idx][i]]++;
                //Q.push(make_pair(A[idx][i], D[A[idx][i]]));
            }
        }
    }
}

int compute(int idx) {
    int sol = 1;
    while(idx != 1) {
        sol = sol * P[idx];
        idx = T[idx];
    }
    return sol;
}

int main() {
    freopen(FILEIN, "r", stdin);
    freopen(FILEOUT, "w", stdout);

    scanf("%d %d", &N, &M);

    for ( int i = 1, x, y, c; i <= M; i++) {
        scanf("%d %d %d", &x, &y, &c);
        A[x].push_back(y); C[x].push_back(log10l(c));
        A[y].push_back(x); C[y].push_back(log10l(c));
    }

    dijkstra();

    for ( int i = 2; i <= N; i++) {
        printf("%d ", compute(i));
    }
    printf("\n");

    return 0;
}