Pagini recente » Cod sursa (job #409102) | Cod sursa (job #3159824) | Cod sursa (job #3229155) | Cod sursa (job #2713641) | Cod sursa (job #1837412)
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
int n,m,nh;
int heap[50003],poz[50003],d[50003];
vector<pair<int, int > > graf[50003];
void sw(int i,int j)
{
swap(heap[i],heap[j]);
poz[heap[i]]=i;
poz[heap[j]]=j;
}
void heapup(int k)
{
if(k<=1)
return;
int t=k/2;
if (d[heap[k]]<d[heap[t]])
{
sw(t,k);
heapup(t);
}
}
void heapdw(int k)
{
int f=2*k;
if (f<=nh)
{
if (f+1<=nh&&d[heap[f+1]]<d[heap[f]])
f++;
if (d[heap[f]]<d[heap[k]])
{
sw(f,k);
heapdw(f);
}
}
}
int ins()
{
sw(1,nh);
poz[heap[nh]]=0;
nh--;
return heap[nh+1];
}
void dij(int x)
{
for(int i=1;i<=n;i++)
d[i]=1<<30,heap[i]=poz[i]=i;
d[x]=0;
nh=n;
while(nh)
{
x=ins();
heapdw(1);
for(int i=0;i<graf[x].size();i++)
{
if(d[graf[x][i].first]>d[x]+graf[x][i].second&&poz[graf[x][i].first])
{
d[graf[x][i].first]=d[x]+graf[x][i].second;
heapup(poz[graf[x][i].first]);
}
}
}
}
int main()
{
freopen("dijkstra.in","r",stdin);
freopen("dijkstra.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1,x,y,z;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
graf[x].push_back(make_pair(y,z));
}
dij(1);
for(int i=2,j=1<<30;i<=n;i++)
{
if(d[i]<j)
printf("%d ",d[i]);
else
printf("0 ");
}
return 0;
}