Pagini recente » Cod sursa (job #392940) | Cod sursa (job #1292276) | Cod sursa (job #918614) | Cod sursa (job #1292153) | Cod sursa (job #365525)
Cod sursa(job #365525)
#include <cstdio>
#define DIM 50005
const int INF = 1<<30;
struct nod
{
int capat, cost;
nod *next;
} *v[DIM];
int n, m, dist[DIM], viz[DIM], s;
int smallest()
{
int min = INF + 1, ibun = 15;
for (int i = 1; i <= n; ++i)
if (!viz[i])
if (dist[i] < min)
min = dist[i], ibun = i;
return ibun;
}
bool gata()
{
for (int i = 1; i <= n; ++i)
if (!viz[i])
return false;
return true;
}
void dijkstra()
{
if (n%2==0)
s = (n / 2) * (n+1);
else
s = ((n+1)/2) * n;
dist[1] = 0;
nod *t;
int i, suma = 0;
while (suma < s) //cat timp nu is vizitate toate nodurile
{
i = smallest();
suma += i;
if (dist[i] == INF)
break;
t = v[i];
viz[i] = 1;
while (t != NULL)
{
if (!viz[t->capat])
if (dist[i] + t->cost < dist[t->capat])
dist[t->capat] = dist[i] + t->cost;
t = t->next;
}
}
FILE *f = fopen("dijkstra.out", "w");
for (i = 2; i <= n; ++i)
fprintf(f, "%d ", dist[i] == INF?0:dist[i]);
fclose(f);
}
int main()
{
FILE *f = fopen("dijkstra.in", "r");
fscanf(f, "%d%d", &n, &m);
int i, j, c;
for (i = 1; i <= n; ++i)
v[i] = NULL, dist[i] = INF;
nod *t;
for (;m; --m)
{
fscanf(f, "%d%d%d", &i, &j, &c);
t = new nod;
t->capat = j;
t->cost = c;
t->next = v[i];
v[i] = t;
}
fclose(f);
dijkstra();
/*
for (i = 1; i <= n; ++i)
{
t = v[i];
printf ("%d ", i);
while (t != NULL)
{
printf ("%d ", t->capat);
t = t -> next;
}
printf ("\n");
}
*/
return 0;
}