Pagini recente » Cod sursa (job #2004898) | Istoria paginii blog/doi-la-suta-2008-raport | Cod sursa (job #1010805) | Cod sursa (job #1322170) | Cod sursa (job #2147764)
#include<stdio.h>
using namespace std;
const int N = 50005, M = 250005, INF = 1000000000;
int vf[M], lst[N], urm[M], nrm, d[M], h[N], nrh, drum[N], poz[N];
void adauga (int x, int y, int dist)
{
vf[++nrm] = y;
urm[nrm] = lst[x];
d[nrm] = dist;
lst[x] = nrm;
}
void schimba (int p1, int p2)
{
int aux;
aux = h[p1];
h[p1] = h[p2];
h[p2] = aux;
poz[h[p1]] = p1;
poz[h[p2]] = p2;
}
void urca (int p)
{
while (p > 1 && drum[h[p]] < drum[h[p>>1]])
{
schimba (p, p >> 1);
p >>= 1;
}
}
void coboara (int p)
{
int bun = p, fs = 2 * p, fd = 2 * p + 1;
if (fs <= nrh && drum[h[fs]] < drum[h[bun]])
bun = fs;
if (fd <= nrh && drum[h[fd]] < drum[h[bun]])
bun = fd;
if (bun != p)
{
schimba (bun, p);
coboara (bun);
}
}
int main ()
{
FILE *in, *out;
in = fopen ("dijkstra.in", "r");
out = fopen ("dijkstra.out", "w");
int n, m;
fscanf (in, "%d%d", &n, &m);
int i, x, y, dist;
for (i = 1; i <= m; i++)
{
fscanf (in, "%d%d%d", &x, &y, &dist);
adauga (x, y, dist);
}
for (i = 1; i <= n; i++)
{
h[i] = i;
poz[i] = i;
drum[i] = INF;
}
nrh = n;
drum[1] = 0;
int p;
while (nrh > 0)
{
x = h[1];
schimba (1, nrh--);
coboara (1);
p = lst[x];
while (p != 0)
{
y = vf[p];
dist = d[p];
if (dist + drum[x] < drum[y])
{
drum[y] = dist + drum[x];
urca(poz[y]);
//coboara(poz[y]);
}
p = urm[p];
}
}
for (i = 2; i <= n; i++)
{
if (drum[i] != INF)
fprintf (out, "%d ", drum[i]);
else
fprintf (out, "0 ");
}
return 0;
}