Cod sursa(job #1551739)

Utilizator spatarelDan-Constantin Spatarel spatarel Data 16 decembrie 2015 15:28:37
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <cstdio>

#define MAX_N 50000
#define MAX_M 250000
#define INF 0x3fffffff
         // 0011 1111 1111 1111 1111 1111 1111 1111
int N, M;

int neighbours[1 + MAX_N];

int nrMuchii = 1;
int id[1 + MAX_M];
int cost[1 + MAX_M];
int next[1 + MAX_M];

int distanta[1 + MAX_N];

int deCateOri[1 + MAX_N];
char inCoada[1 + MAX_N];
int begin, end;
int coada[MAX_N];

void addEdge(int u, int v, int _cost) {
  id[nrMuchii] = v;
  cost[nrMuchii] = _cost;
  next[nrMuchii] = neighbours[u];
  neighbours[u] = nrMuchii;
  nrMuchii++;
}

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

  // citirea datelor
  scanf("%d%d", &N, &M);
  for (i = 0; i < M; ++i) {
    int u, v, cost;
    scanf("%d%d%d", &u, &v, &cost);
    addEdge(u, v, cost);
    addEdge(v, u, cost);
  }

  // calcularea solutiei
  int start = 1;
  for (u = 1; u <= N; u++) {
    distanta[u] = INF;
  }
  distanta[start] = 0;

  begin = 0;
  end = 0;
  coada[end++] = start;
  while (begin < end) {
    int u = coada[begin % MAX_N]; begin++;
    inCoada[u] = 0;
    int poz = neighbours[u];
    while (poz != 0) {
      if (distanta[id[poz]] > distanta[u] + cost[poz]) {
        distanta[id[poz]] = distanta[u] + cost[poz];
        if (inCoada[id[poz]] == 0) {
          inCoada[id[poz]] = 1;
          coada[end % MAX_N] = id[poz]; end++;
        }
      }
      poz = next[poz];
    }
  }
  for (u = 2; u <= N; u++) {
    if (distanta[u] == INF) {
      distanta[u] = 0;
    }
  }

  for (u = 2; u <= N; u++) {
    printf("%d ", distanta[u]);
  }
  printf("\n");

  return 0;
}