Pagini recente » Cod sursa (job #1555768) | Cod sursa (job #332199) | Cod sursa (job #2675693) | Cod sursa (job #3174570) | Cod sursa (job #294130)
Cod sursa(job #294130)
#include<stdio.h>
#define N 50001
#define INF 30000
#define M 51001
void bellman();
struct nod{ int info, cost;
nod *urm; } *prim[N],*p,*q;
struct nod_c {int val;
nod_c *next; } *first, *last, *s;
int d[N], viz[N], n, m, i, j, x, y, c, coada[N], k;
void adauga(nod *&prim, int info, int d){
nod *p;
p = new nod;
p->info = info;
p->cost = d;
p->urm = prim;
prim = p;
}
int main()
{
freopen("dijkstra.in","r", stdin);
freopen("dijkstra.out","w", stdout);
scanf("%d %d %d", &n, &m, &k);
for( i = 1; i <= k; ++i)
scanf("%d",&coada[i]);
for( i = 1; i <= m; i++)
{
scanf("%d %d %d", &x, &y, &c);
adauga(prim[x],y,c);
adauga(prim[y],x,c);
}
bellman();
for(i = 2; i <= n; i++)
if(d[i] < INF)
printf("%d ", d[i]);
else
printf("0 ");
return 0;
}
void inc(int &x){
if(x==M-1)x=0;
else x++;
}
void bellman()
{
int nod_cur,p,u;
for( i = 1; i <= n; i++)
d[i] = INF;
for(i = 1; i <= k; ++i){
d[coada[i]] = 0;
viz[coada[i]] = 1;
}
p=0;
u=1;
while(p != u)
{
nod_cur = coada[p];
viz[nod_cur] = 0;
for(q = prim[nod_cur]; q; q = q->urm)
if(d[nod_cur] + q->cost < d[q->info])
{
d[q->info] = d[nod_cur] + q->cost;
if(viz[q->info] == 0)
{
coada[u] = q->info;
viz[q->info] = 1;
inc(u);
}
}
inc(p);
}
}