Pagini recente » Cod sursa (job #2272808) | Cod sursa (job #2879848) | Cod sursa (job #2594420) | Cod sursa (job #1477376) | Cod sursa (job #271428)
Cod sursa(job #271428)
#include <stdio.h>
#include <string.h>
const int NMAX=50010;
const long MMAX=250010;
const long INF=100000000;
int *a[NMAX], *c[NMAX], n, x[MMAX], y[MMAX], z[MMAX], d[NMAX];;
bool viz[NMAX];
long dist[NMAX];
void dijkstra(int nod);
int main()
{
long i, m;
freopen("dijkstra.in", "r", stdin);
freopen("dijkstra.out", "w", stdout);
scanf("%d%ld", &n, &m);
for (i=0; i<m; i++)
{
scanf("%d%d%d", &x[i], &y[i], &z[i]);
d[x[i]]++;
}//for i
for (i=1; i<=n; i++)
{
a[i]=new int[d[i]+1];
c[i]=new int[d[i]+1];
a[i][0]=0;
c[i][0]=0;
}//for i
for (i=0; i<m; i++)
{
a[x[i]][++a[x[i]][0]]=y[i];
c[x[i]][++c[x[i]][0]]=z[i];
}//for i
dijkstra(1);
for (i=2; i<=n; i++)
if (dist[i]==INF)
printf("0 ");
else
printf("%ld ", dist[i]);
return 0;
}//main
void dijkstra(int nod)
{
bool gasit;
long min;
int i;
for (i=1; i<=n; i++)
dist[i]=INF;
dist[nod]=0;
gasit=1;
while (gasit)
{
for (i=1; i<=a[nod][0]; i++)
{
if ((c[nod][i]>=0)&&((dist[nod]+c[nod][i])<dist[a[nod][i]]))
dist[a[nod][i]]=dist[nod]+c[nod][i];
}//for i
viz[nod]=1;
gasit=0;
min=INF;
for (i=1; i<=n; i++)
if ((!viz[i])&&(min>dist[i]))
{
min=dist[i];
gasit=1;
nod=i;
}//if
}//while
}//dijkstra