Cod sursa(job #1275547)

Utilizator juniorOvidiu Rosca junior Data 25 noiembrie 2014 12:51:13
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <fstream>
#include <iostream>

#define MARE 100000000

using namespace std;

int i, n, m, l, c, s, a[1001][1001], d[1001];
bool sel[1001];
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");

void dijkstra (int s) {
  int minim, jmin, dn, i, j;

  for (i = 1; i <= n; i++)
    d[i] = a[s][i]; // Initializam distanta fata de sursa.
  sel[s] = true; // Aratam ca sursa este selectata.
  d[s] = 0; // Distanta de la sursa la sursa este 0.
  for (i = 2; i <= n; i++) {
    minim = MARE;
    for (j = 1; j <= n; j++) // pentru fiecare nod
      if (not sel[j]) // daca nu este selectat
        if (minim > d[j]) { // daca avem o valoare mai mica pentru distanta
          minim = d[j]; // actualizam min
          jmin = j; // retinem nodul care ne da minimul [jmin]
        }
    sel[jmin] = true; // Includem nodul jmin in multimea nodurilor selectate. (Devine roz.)
    for (j = 1; j <= n; j++) // Pentru fiecare nod_
      if (not sel[j]) {      // neselectat,
        dn = d[jmin] + a[jmin][j]; // calculam distanta noua, folosind jmin.
        if (d[j] > dn) // Daca am gasit un lant mai scurt prin jmin,
          d[j] = dn;   // actualizam distanta de la sursa la nod.
      }
  }
}

int main () {
  fin >> n >> m >> s;
  for (l = 1; l <= n; l++)
    for (c = 1; c <= n; c++)
      a[l][c] = MARE;
  for (i = 1; i <= m; i++) {
    fin >> l >> c; fin >> a[l][c];
    a[c][l] = a[l][c];
  }
  dijkstra(s);
  for (i = 2; i <= n; i++) {
    if (d[i] == MARE)
      fout << "0 ";
    else
      fout << d[i] << ' ';
  }
  return 0;
}