Cod sursa(job #520012)

Utilizator CezarMocanCezar Mocan CezarMocan Data 7 ianuarie 2011 11:55:57
Problema Algoritmul lui Dijkstra Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb

#include <cstdio>
#include <cstring>
#include <vector>

using namespace std;

const int maxN = 251000;
const long long inf = 100000000000000000LL;

int N, R, P, M, start;
vector <int> G[maxN], cost[maxN];
long long cMin[maxN];
int Q[maxN * 50];
bool viz[maxN];

inline int next(int x) {
    x++;
    if (x >= maxN * 50)
        x -= maxN * 50;
    return x;
}

inline void bford(int nod) {
    int i;
    int p, u, fiu;
    
    p = u = 1;
    Q[p] = nod;

    while (p <= u) {
        nod = Q[p];
//        fprintf(stderr, "%d %d\n", nod, p);
        viz[nod] = 0;
        for (i = 0; i < G[nod].size(); i++) {
            fiu = G[nod][i];
            if (cMin[fiu] > cMin[nod] + cost[nod][i]) {
//                fprintf(stderr, "fiu: %d\n", fiu);
                cMin[fiu] = cMin[nod] + cost[nod][i];
                if (!viz[fiu]) {
                    viz[fiu] = 1;
                    u = next(u);
                    Q[u] = fiu;
                }
            }
        }

        p = next(p);
    }
}

int main() {
    int i;
    int a, b, c;
    freopen("dijkstra.in", "r", stdin);
    freopen("dijkstra.out", "w", stdout);

    scanf("%d%d", &N, &M);
	start = 1;

    for (i = 1; i <= M; i++) {
        scanf("%d %d %d", &a, &b, &c);
        G[a].push_back(b);
        cost[a].push_back(c);
    }

    for (i = 1; i <= N; i++)
        cMin[i] = inf;
    cMin[start] = 0;

    memset(viz, 0, sizeof(viz));
    bford(start);

    for (i = 2; i <= N; i++)
        if (cMin[i] == inf)
            printf("0 ");
        else
            printf("%lld ", cMin[i]);

    return 0;
}