Pagini recente » Cod sursa (job #2217181) | Cod sursa (job #432059) | Cod sursa (job #1846942) | Cod sursa (job #132515) | Cod sursa (job #1551739)
#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;
}