Pagini recente » Cod sursa (job #3203367) | Cod sursa (job #644474) | Cod sursa (job #757583) | Cod sursa (job #2822640) | Cod sursa (job #203559)
Cod sursa(job #203559)
#include <stdio.h>
#define N 50005
#define M 250005
#define st(x) 2*(x)
#define dr(x) 2*(x)+1
#define pr(x) (x)/2
long n,m;
long p[N];//200k
struct vecin
{int cost;
long urm;
unsigned int nod;
}v[2*M];//4000k
long vv;
long h[M];//300k
long vh;
long pheap[N];//200k
long cost[N];//200k
int flagn[N];//100k
int flagf[N];//100k
void adauga_muchie(long a,long b,int c)
{vv++;
v[vv].urm=p[a];
p[a]=vv;
v[vv].nod=b;
v[vv].cost=c;
}
void interschimba (long a,long b)
{long aux;
aux=h[a];
h[a]=h[b];
h[b]=aux;
pheap[h[a]]=a;
pheap[h[b]]=b;
}
void adauga_heap(long nod,long c)
{vh++;
long i;
h[vh]=nod;
cost[nod]=c;
for (i=vh;cost[h[i]]<cost[h[pr(i)]]&&pr(i);i=pr(i))
{interschimba(i,pr(i));
}
}
void adauga_vecini(long a)
{long q,i;
for (q=p[a];q!=0;q=v[q].urm)
{if(flagf[v[q].nod]==0)
{if(flagn[v[q].nod]==0)
{adauga_heap(v[q].nod,v[q].cost+cost[a]);
flagf[v[q].nod]=1;
}
}
else
{if(cost[v[q].nod]>cost[a]+v[q].cost)
{cost[v[q].nod]=cost[a]+v[q].cost;
for (i=pheap[v[q].nod];cost[h[i]]<cost[h[pr(i)]]&&pr(i);i=pr(i))
{interschimba(i,pr(i));
}
}
}
}
}
void sift(long k)
{long min=k;
if(st(k)<=vh&&cost[h[st(k)]]<cost[h[k]])
{min=st(k);
}
if(dr(k)<=vh&&cost[h[dr(k)]]<cost[h[min]])
{min=dr(k);
}
if(min!=k)
{interschimba(k,min);
sift(min);
}
}
void scoate_minim()
{flagf[h[1]]=0;
flagn[h[1]]=1;
pheap[h[1]]=0;
h[1]=h[vh];
pheap[h[1]]=1;
vh--;
sift(1);
}
int main ()
{long a,b;int c;long i;
long min;
freopen("dijkstra.in","r",stdin);
freopen("dijkstra.out","w",stdout);
scanf("%ld%ld",&n,&m);
for (vv=0,i=1;i<=m;i++)
{scanf("%u%u%d",&a,&b,&c);
adauga_muchie(a,b,c);
}
flagn[1]=1;
cost[1]=0;
adauga_vecini(1);
for (i=1;i<=n;i++)
{min=h[1];
// cost[min.nod]=min.cost;
scoate_minim();
adauga_vecini(min);
}
for (i=2;i<=n;i++)
{printf("%ld ",cost[i]);
}
return 0;
}