Cod sursa(job #1564246)

Utilizator TopiAlexTopala Alexandru TopiAlex Data 9 ianuarie 2016 14:54:56
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <stdio.h>
#include <vector>
#include <set>
#include <cstring>
#define N_MAX 50003
#define M_MAX 250003
#define INFINIT 999999

using namespace std;

FILE *f, *g;

int n, m;
int d[N_MAX];
const int START = 1;

vector<int> v[N_MAX];
vector<int> cost[N_MAX];
set< pair<int, int> > lista;

inline void citire();
void Dijkstra(int);
inline void afisare();

int main()
{
    citire();
    Dijkstra(START);
    afisare();

    fclose(f);
    fclose(g);

    return 0;
}

inline void citire(){
    f = fopen("dijkstra.in", "r");
    g = fopen("dijkstra.out", "w");

    fscanf(f, "%d %d\n", &n, &m);

    int x, y;
    int c;

    for (int i = 1; i <= m; ++i){
        fscanf(f, "%d %d %d\n", &x, &y, &c);
        v[x].push_back(y);
        cost[x].push_back(c);
    }
}

void Dijkstra(int start){
    int nod;
    int c;
    int i;
    int v_size;

    lista.insert(make_pair(0, start));
    memset(d, INFINIT, sizeof(d));
    d[start] = 0;

    while (!lista.empty()){
        c = lista.begin()->first;
        nod = lista.begin()->second;
        lista.erase(lista.begin());
        v_size = v[nod].size();

        for (i = 0; i < v_size; ++i){
            if (d[v[nod][i]] > c + cost[nod][i]){
                d[v[nod][i]] = c + cost[nod][i];
                lista.insert(make_pair(d[v[nod][i]], v[nod][i]));
            }
        }
    }
}

inline void afisare(){
    for (int i = 2; i <= n; ++i){
        fprintf(g, "%d ", d[i]);
    }
    fprintf(g, "\n");
}