Pagini recente » Istoria paginii utilizator/alexa_myparadise | Cod sursa (job #1620006) | Profil Simon2712 | Istoria paginii utilizator/duyle | Cod sursa (job #360014)
Cod sursa(job #360014)
#include<stdio.h>
#include<vector>
#define inf 1000000000
using namespace std;
int n,m,nr;
int h[50005],p[50005],d[50005];
vector<int> v[50005];
vector<int> c[50005];
void up(int i)
{
while((i>>1) && d[h[i]]<d[h[i>>1]])
{
int aux;
aux=h[i];
h[i]=h[i>>1];
h[i>>1]=aux;
aux=p[i];
p[i]=p[i>>1];
p[i>>1]=aux;
i=i>>1;
}
}
void down(int i)
{
int j=i,aux;
if((i<<1)<=nr && (d[h[i]]>d[h[i<<1]]))
j=i<<1;
if((i<<1)+1<=nr && (d[h[i]]>d[h[(i<<1)+1]]))
j=(i<<1)+1;
if(j==i)
return;
aux=p[h[i]];
p[h[i]]=p[h[j]];
p[h[j]]=aux;
aux=h[i];
h[i]=h[j];
h[j]=aux;
down(j);
}
void dijkstra(int s)
{
int i,j,k,lim=v[s].size();
d[s]=0;
for(i=0;i<lim;i++)
{
h[++nr]=v[s][i];
d[h[nr]]=c[s][i];
p[v[s][i]]=nr;
up(nr);
}
while(nr)
{
lim=v[h[1]].size();
j=h[1];
for(i=0;i<lim;i++)
if(d[j]+c[j][i]<d[v[j][i]])
{
k=v[j][i];
if(d[k]==inf)
{
d[k]=d[j]+c[j][i];
h[++nr]=k;
p[k]=nr;
up(nr);
}
else
{
d[k]=d[j]+c[j][i];
up(p[k]);
}
}
p[h[nr]]=1;
h[1]=h[nr];
nr--;
down(1);
}
}
int main()
{
freopen("dijkstra.in","r",stdin);
freopen("dijkstra.out","w",stdout);
int i,x,y,z;
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
v[x].push_back(y);
c[x].push_back(z);
}
for(i=1;i<=n;i++)
{
d[i]=inf;
}
dijkstra(1);
for(i=2;i<=n;i++)
printf("%d ",d[i]);
return 0;
}