Cod sursa(job #1024700)

Utilizator Alina_MariaMateescu Adina Lenuta Maria Alina_Maria Data 8 noiembrie 2013 23:13:30
Problema Algoritmul lui Dijkstra Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string>
#include <vector>

#define maxN 50005
#define maxM 250005
#define INF 1000000
using namespace std;

int N, M, c, x, y;
vector<pair<int, int> > arr[maxN];
vector<int> cost(maxN, INF), vizitat(maxN, 0);

void citireMuchii() {
    for(int i = 1; i <= M; ++i) {
        scanf("%d %d %d", &x, &y, &c);
        arr[x].push_back(make_pair(y, c));
    }
}
void afisareMuchii() {
    for(int i = 1; i <= N; ++i) {
        printf("%d: ", i);
        for(int j = 0; (unsigned)j < arr[i].size(); ++j) {
            printf(" %d, c = %d ", arr[i][j].first, arr[i][j].second);
        }
        printf("\n");
    }
}

void dijkstra(int start) {
    int pmin, pminA, pminC, calcActual, m;
    cost[start] = 0;
    vizitat[start] = 0;
    for(int i = 1; i <= N; ++i) {
        m = INF;
        for(int j = 1; j <= N; ++j) {
            if (cost[j] < m && !vizitat[j]) {
                m = cost[j]; pmin = j;
            }
        }

        vizitat[pmin] = 1;

        for(int k = 0; (unsigned)k < arr[pmin].size(); ++k) {
            pminA = arr[pmin][k].first;
            pminC = arr[pmin][k].second;
            calcActual = cost[pmin] + pminC;
            if (cost[pminA] > calcActual)
                cost[pminA] = calcActual;
        }
    }
}

int main()
{
    freopen("dijkstra.in", "r", stdin);
    freopen("dijkstra.out", "w", stdout);
    scanf("%d %d", &N, &M);
    citireMuchii();
//    afisareMuchii();
//    printf("=============================================");
    dijkstra(1);
    for(int i = 2; i <= N; ++i)
            printf("%d ", (cost[i] == INF) ? 0: cost[i]);
    return 0;
}