Pagini recente » Cod sursa (job #2052322) | Cod sursa (job #1197382) | Cod sursa (job #627320) | Cod sursa (job #2629102) | Cod sursa (job #448473)
Cod sursa(job #448473)
#include <stdio.h>
#include <stdlib.h>
#define in "dijkstra.in"
#define out "dijkstra.out"
#define NMAX 50005
#define MMAX 250005
#define INF (1<<30)
#define DIM 3000000
typedef struct nod {
int vf;
int c;
struct nod* next;
} *PNOD, NOD;
PNOD L[NMAX];
int N, M;
int d[NMAX];
char sel[NMAX];
int minim, ok;
void Add( int i, int j, int c)
{
PNOD p = (PNOD) calloc(1, sizeof(NOD));
p->vf = j;
p->c= c;
p->next = L[i];
L[i] = p;
}
int main(void)
{
freopen (in, "r", stdin);
freopen (out, "w", stdout);
int i, j, k, tur, poz = 0;
PNOD p;
char buf[DIM];
fread (buf, 1, DIM, stdin);
#define cit(x) \
{ \
x = 0; \
while (buf[poz] < '0') \
{ \
++poz; \
if (poz == DIM) { \
fread (buf, 1, DIM, stdin); poz = 0; } \
} \
while (buf[poz] >= '0') \
{ \
x = x*10 + buf[poz] - '0'; \
if (++poz == DIM) { \
fread (buf, 1, DIM, stdin); poz = 0;} \
} \
}
cit (N) cit (M)
for ( ; M; --M)
{
cit (i) cit(j) cit(k)
Add (i, j, k);
}
for (i = 1; i <= N; ++i)
{
d[i] = INF;
sel[i] = 0;
}
d[1] = 0;
for (tur = 1; tur <= N; ++tur)
{
minim = INF;
for (i = 1; i <= N; ++i)
if ( !sel[i] && minim > d[i])
{
minim = d[i];
ok = i;
}
sel[ok] = 1;
for (p = L[ok]; p; p = p->next)
if ( d[p->vf] > d[ok] + p->c)
d[p->vf] = d[ok] + p->c;
}
for (i = 2; i <= N; ++i)
printf ("%d ", d[i] == INF ? 0 : d[i]);
return 0;
}