Pagini recente » Cod sursa (job #1998017) | Cod sursa (job #59951) | Cod sursa (job #2952409) | Cod sursa (job #3213143) | Cod sursa (job #639106)
Cod sursa(job #639106)
#include <iostream>
#include <fstream>
#include <vector>
#define N 51000
#define M 251000
#define MAXINT 60000000
using namespace std;
ifstream in("dijkstra.in");
ofstream out("dijkstra.out");
vector <int> a[N];
unsigned dr[M],poz[N],h[N];
int minim[N];
short cost[M];
inline void swap(unsigned a,unsigned b)
{
unsigned c=h[a];
h[a]=h[b];
h[b]=c;
poz[h[a]]=a;
poz[h[b]]=b;
}
inline void urca(unsigned p)
{
while(p!=1 && minim[h[p]]<minim[h[p/2]])
{
swap(p,p/2);
p=p/2;
}
}
inline void coboara(unsigned p)
{
int ps=p;
if(p*2<=h[0] && minim[h[ps]]>minim[h[p*2]])
ps=p*2;
if(p*2+1<=h[0] && minim[h[ps]]>minim[h[p*2+1]])
ps=p*2+1;
if(ps!=p)
{
swap(ps,p);
coboara(ps);
}
}
inline void scoate(unsigned x)
{
h[poz[x]]=h[h[0]];
poz[h[h[0]]]=poz[x];
h[0]--;
urca(poz[x]);
coboara(poz[x]);
}
int main()
{
unsigned n,i,x;
int m,j;
in>>n>>m;
for(i=1;i<=m;++i)
{
in>>x>>dr[i]>>cost[i];
a[x].push_back(i);
}
for(i=1;i<=n;++i)
{
minim[i]=MAXINT;
h[i]=i;
poz[i]=i;
}
h[0]=n;
minim[1]=0;
for(i=1;i<=n;++i)
{
if (minim[h[1]]==MAXINT) break;
x=h[1];
scoate(x);
for(j=0;j<a[x].size();++j)
{
if(minim[x]+cost[a[x][j]]<minim[dr[a[x][j]]])
{
minim[dr[a[x][j]]]=minim[x]+cost[a[x][j]];
urca(poz[dr[a[x][j]]]);
}
}
}
for(i=2;i<=n;++i)
{
if (minim[i]==MAXINT)
out<<"0 ";
else
out<<minim[i]<<" ";
}
return 0;
}