Cod sursa(job #193063)
Utilizator | Data | 2 iunie 2008 01:37:24 | |
---|---|---|---|
Problema | Algoritmul lui Dijkstra | Scor | 40 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 3.17 kb |
#include <stdio.h>
#include <math.h>
#define inf 1 << 30
#define maxn 50001
struct nod
{
int nod2, dist;
nod *next;
};
nod *top [maxn];
int n, m, used [maxn], v [maxn];
void Insert (int nod1, int nod2, int dist)
{
nod *aux;
aux=new nod;
aux->nod2=nod2;
aux->dist=dist;
if (!top [nod1])
{
aux->next=NULL;
top [nod1]=aux;
}
else
{
aux->next=top [nod1];
top [nod1]=aux;
}
}
void scan ()
{
int i, nod1, nod2, dist;
scanf ("%d %d", &n, &m);
for (i=1; i<=m; ++i)
{
scanf ("%d %d %d", &nod1, &nod2, &dist);
Insert (nod1, nod2, dist);
}
}
void dijkstra ()
{
int i, j, min, pmin;
nod *p;
for (i=2; i<=n; ++i)
v [i]=inf;
used [1]=1;
p=top [1];
while (p)
{
if (v [p->nod2] > v [1]+p->dist)
v [p->nod2]=v [1]+p->dist;
p=p->next;
}
for (i=1; i<=n; ++i)
{
min=inf;
for (j=1; j<=n; j++)
if (!used [j] && v [j] < min)
{
min=v [j];
pmin=j;
}
p=top [pmin];
used [pmin]=1;
while (p)
{
if (v [p->nod2] > v [pmin]+p->dist)
v [p->nod2]=v [pmin]+p->dist;
p=p->next;
}
}
}
void print ()
{
int i;
for (i=2; i<=n; ++i)
if (v [i] != inf)
printf ("%d ", v [i]);
else
printf ("0 ");
}
int main ()
{
freopen ("dijkstra.in", "r", stdin);
freopen ("dijkstra.out", "w", stdout);
scan ();
dijkstra ();
print ();
return 0;
}