Pagini recente » Cod sursa (job #338809) | Cod sursa (job #3157089) | Cod sursa (job #743976) | Cod sursa (job #1665828) | Cod sursa (job #147835)
Cod sursa(job #147835)
#define inf 60000000
#include <stdio.h>
#define maxn 50002
struct NOD{long int nod; int s; NOD *next;};
NOD *g[maxn];
long int pmin, i, n, m, d[maxn], h[maxn], pos[maxn], k;
void swap(long int a, long int b)
{
long int x = h[a];
h[a] = h[b];
h[b] = x;
}
void upheap(long int what)
{
long int os;
while (what > 1)
{
os = what >> 1;
if (d[h[os]] > d[h[what]])
{
pos[h[what]] = os;
pos[h[os]] = what;
swap(os, what);
what = os;
}
else
what = 1;
}
}
void downheap(long int what)
{
long int f;
while (what <= k)
{
f = what;
if ((what << 1) <= k)
{
f = what << 1;
if (f + 1 <= k)
if (d[h[f + 1]] < d[h[f]])
f++;
}
else return;
if (d[h[what]] > d[h[f]])
{
pos[h[what]] = f;
pos[h[f]] = what;
swap(what, f);
what = f;
}
else return;
}
}
int main()
{
freopen("dijkstra.in", "r", stdin);
freopen("dijkstra.out", "w", stdout);
scanf("%li %li", &n, &m);
for (i = 1; i <= m; ++i)
{
long int a, b, c;
scanf("%li %li %li", &a, &b, &c);
NOD *p = new NOD;
p->nod = b;
p->s = c;
p->next = g[a];
g[a] = p;
}
for (i = 2; i <= n; ++i)
d[i] = inf, pos[i] = -1;
pos[1] = 1;
h[++k] = 1;
while (k)
{
long int min = h[1];
swap(1, k);
pos[h[1]] = 1;
--k;
downheap(1);
NOD *p = g[min];
while (p)
{
if (d[p->nod] > d[min] + p->s)
{
d[p->nod] = d[min] + p->s;
if (pos[p->nod] != -1)
upheap(pos[p->nod]);
else
{
h[++k] = p->nod;
pos[h[k]] = k;
upheap(k);
}
}
p = p->next;
}
}
for (i = 2; i <= n; ++i)
if (d[i] != inf)
printf("%li ", d[i]);
else printf("%d ", 0);
printf("\n");
fclose(stdin);
fclose(stdout);
return(0);
}