Cod sursa(job #1541578)

Utilizator spatarelDan-Constantin Spatarel spatarel Data 4 decembrie 2015 13:01:51
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <cstdio>
#include <vector>
#include <queue>

using std::vector;
using std::queue;

const int MAX_N = 50000;

struct Muchie {
  int nod;
  int cost;
};

int V, E;
vector<Muchie> vecini[1 + MAX_N];

queue<int> coadaBF;
bool inCoadaBF[1 + MAX_N];

int distanta[1 + MAX_N];

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

  // citirea datelor
  scanf("%d %d", &V, &E);
  for (i = 0; i < E; ++i) {
    int u, v, c;
    scanf("%d %d %d", &u, &v, &c);
    vecini[u].push_back({v, c});
  }

  // calcularea solutiei
  int sursa = 1;
  coadaBF.push(sursa);
  inCoadaBF[sursa] = true;
  for (i = 1; i <= V; i++) {
    distanta[i] = 0x3fffffff;
  }
  distanta[sursa] = 0;

  int pasi = 0;
  while (!coadaBF.empty() && pasi <= V * E) {
    pasi++;
    int nod = coadaBF.front();
    coadaBF.pop();
    inCoadaBF[nod] = false;
    //for (i = 0; i < vecini[nod].size(); i++) {
    //  Muchie muchie = vecini[nod][i];
    for (Muchie muchie : vecini[nod]) {
      if (distanta[muchie.nod] > distanta[nod] + muchie.cost) {
        distanta[muchie.nod] = distanta[nod] + muchie.cost;
        if (!inCoadaBF[muchie.nod]) {
          coadaBF.push(muchie.nod);
          inCoadaBF[muchie.nod] = true;
        }
      }
    }
  }

  // afisarea solutiei
  for (i = 2; i <= V; i++) {
    printf("%d ", distanta[i]);
  }
  printf("\n");

  return 0;
}