Pagini recente » Cod sursa (job #1060399) | Cod sursa (job #315191) | Cod sursa (job #629359) | Cod sursa (job #3262054) | Cod sursa (job #866038)
Cod sursa(job #866038)
#include<cstdio>
#include<vector>
#define nmax 50005
#define inf (1<<30)
#define swap2(a,b) poz[heap[a]]=b
#define TIP vector < pair<int,int> >
using namespace std;
TIP a[nmax];
int n,m,d[nmax],heap[nmax],poz[nmax],k;
void up(int c)
{
while(c>1)
{
if(d[heap[c/2]]>d[heap[c]])
{
swap2(c/2,c);
swap2(c,c/2);
swap(heap[c/2],heap[c]);
c>>=1;
}
else
return;
}
}
void down(int c)
{
int jos;
while(c<=k)
{
jos=c;
if(c*2<=k)
{
jos<<=1;
if(jos+1<=k && d[heap[jos+1]]<d[heap[jos]])
jos++;
}
else
return;
if(d[heap[c]]>d[heap[jos]])
{
swap2(c,jos);
swap2(jos,c);
swap(heap[jos],heap[c]);
c=jos;
}
else
return;
}
}
void dijkstra()
{
int minim;
while(k)
{
minim=heap[1];
swap(heap[1],heap[k]);
k--;
down(1);
TIP :: iterator it;
it=a[minim].begin();
while(it!=a[minim].end())
{
if(d[(*it).first]>d[minim]+(*it).second)
{
d[(*it).first]=d[minim]+(*it).second;
if(poz[(*it).first])
up(poz[(*it).first]);
else
{
heap[++k]=(*it).first;
poz[heap[k]]=k;
up(k);
}
}
it++;
}
}
}
int main()
{
freopen("dijkstra.in","r",stdin);
freopen("dijkstra.out","w",stdout);
int i,x,y,z;
scanf("%d %d",&n,&m);
for(i=2;i<=n;i++)
d[i]=inf;
while(m--)
{
scanf("%d %d %d",&x,&y,&z);
a[x].push_back(make_pair(y,z));
}
heap[++k]=1;
poz[1]=1;
dijkstra();
for(i=2;i<=n;i++)
if(d[i]!=inf)
printf("%d ",d[i]);
else
printf("0 ");
return 0;
}