Pagini recente » Cod sursa (job #2178849) | Cod sursa (job #2226926) | Cod sursa (job #1496357) | Cod sursa (job #2855146) | Cod sursa (job #1564838)
#include <stdio.h>
#include <vector>
#define INF 2147483647
using namespace std;
struct vecin
{
int nod,cost;
}auxve;
int n,m,nh;
int d[50001],heap[50001],poz[50001];
vector<vecin> v[50001];
vector<vecin>::const_iterator itr,fin;
void swag(int i,int j) //u don't have it
{
int aux;
aux=heap[j];
heap[j]=heap[i];
heap[i]=aux;
poz[heap[j]]=i;
poz[heap[i]]=j;
}
void heapup(int k)
{
int j,aux;
while(k>1)
{
j=k/2;
if(d[heap[j]]>d[heap[k]]) {swag(j,k);k=j;}
else break;
}
}
int heapout()
{
int j,k,i=1;
swag(1,nh);
nh--;
while(2*i<=nh)
{
j=2*i;
if(d[heap[j]]>d[heap[j+1]]&&j+1<=nh) j++;
if(d[heap[i]]>d[heap[j]]) {swag(i,j);i=j;}
else break;
}
return heap[nh+1];
}
int main()
{
freopen("dijkstra.in","r",stdin);
freopen("dijkstra.out","w",stdout);
int i,j,a,b;
scanf("%d%d",&n,&m);
for(i=0;i<=n;i++)
d[i]=INF;
d[1]=0;
nh=n;
for(i=0;i<m;i++)
{
scanf("%d%d%d",&a,&(auxve.nod),&(auxve.cost));
v[a].push_back(auxve);
}
for(i=1;i<=n;i++)
{
heap[i]=i;
poz[i]=i;
}
while(nh>0)
{
i=heapout();
itr=v[i].begin();
fin=v[i].end();
for(;itr!=fin;itr++)
{
a=(*itr).nod;
b=(*itr).cost;
if(d[i]!=INF&&d[a]>d[i]+b)
{
d[a]=d[i]+b;
heapup(poz[a]);
}
}
}
for(i=2;i<=n;i++)
{
if(d[i]!=INF) printf("%d ",d[i]);
else printf("0 ");
}
return 0;
}