Pagini recente » Cod sursa (job #401180) | Cod sursa (job #2594077) | Cod sursa (job #457338) | Cod sursa (job #1727551) | Cod sursa (job #529094)
Cod sursa(job #529094)
#include <stdio.h>
#include <vector>
#include <utility>
#define NMax 100000
using namespace std;
const char IN[]="dijkstra.in",OUT[]="dijkstra.out";
int N,M;
vector< pair<int,int> > ad[NMax];
vector<int> dist;
int heap[NMax];
int p[NMax];
bool visited[NMax];
void remake(int *a,int i)
{
int min;
int r= 2*i+1;
int l= 2*i;
if (l<=a[0] && dist[a[l]]<dist[a[i]])
min=l;
else
min=i;
if (r<=a[0] && dist[a[r]]<dist[a[min]])
min=r;
if (min!=i)
{
int tmp;
tmp=p[a[min]];
p[a[min]]=p[a[i]];
p[a[i]]=tmp;
tmp=a[min];
a[min]=a[i];
a[i]=tmp;
remake(a,min);
}
}
void make(int *a)
{
int i;
for (i=a[0]/2;i>0;--i)
remake(a,i);
}
void insert(int *a,int val)
{
int i;
++a[0];
a[a[0]]=val;
p[val]=a[0];
for (i=a[0];i>1 && dist[a[i]]<dist[a[i/2]];i/=2)
{
int tmp;
tmp=p[a[i]];
p[a[i]]=p[a[i/2]];
p[a[i/2]]=p[a[i]];
tmp=a[i];
a[i]=a[i/2];
a[i/2]=tmp;
}
}
void up(int *a,int pt)
{
for (int i=pt;i>1 && dist[a[i]]<dist[a[i/2]];i/=2)
{
int tmp;
tmp=p[a[i]];
p[a[i]]=p[a[i/2]];
p[a[i/2]]=p[a[i]];
tmp=a[i];
a[i]=a[i/2];
a[i/2]=tmp;
}
}
void del(int *a,int x)
{
int tmp,pr=p[x];
tmp=p[x];
p[x]=p[a[a[0]]];
p[a[a[0]]]=tmp;
tmp=a[pr];
a[pr]=a[a[0]];
a[a[0]]=tmp;
a[a[0]]=0;
--a[0];
remake(a,pr);
p[x]=0;
}
void Dijkstra()
{
int i,x,c=0;
vector< pair<int,int> >::iterator it;
dist.assign(N+1,-1);
dist[1]=0;
insert(heap,1);
while (heap[0]>0)
{
++c;
x=heap[1];
del(heap,heap[1]);
visited[x]=true;
for ( it= ad[x].begin() ; it<ad[x].end(); ++it)
if ( !visited[it->first] && (dist[it->first]==-1 || dist[it->first]> it->second+dist[x]))
{
dist[it->first]= it->second+dist[x];
if (p[it->first]>0)
up(heap,p[it->first]),
remake(heap,p[it->first]);
else
insert(heap,it->first);
}
}
}
int main()
{
int i,x,y,c;
freopen(IN,"r",stdin);
scanf("%d%d",&N,&M);
for (i=0;i<M;++i)
{
scanf("%d%d%d",&x,&y,&c);
ad[x].push_back(make_pair(y,c));
}
fclose(stdin);
Dijkstra();
freopen(OUT,"w",stdout);
for (i=2;i<=N;++i)
printf("%d ",dist[i]>=0 ? dist[i] : 0);
printf("\n");
fclose(stdout);
return 0;
}