Pagini recente » Cod sursa (job #164672) | Cod sursa (job #2445426) | Cod sursa (job #2436291) | Cod sursa (job #273423) | Cod sursa (job #592758)
Cod sursa(job #592758)
#include<fstream>
#include<vector>
using namespace std;
ifstream fi("dijkstra.in");
ofstream fo("dijkstra.out");
int nr,n,m,a,b,c,sol[50001],d[100001],k,p[100001],t[100001];
vector <pair<int,int> > v[50001];
void down(int x){
int k=d[x];
int pk=p[x];
int ok=1;
while(ok&&x<=nr){
int son=x;
int son1=0;
if(d[2*x]<k)
son=2*x;
if(2*x+1<nr)
if(d[2*x+1]<d[son])
son=2*x+1;
if(son ==x||son>=nr)
ok=0;
else{
d[x]=d[son];
p[x]=p[son];
t[p[x]]=x;
x=son;
}
}
d[x]=k;
p[x]=pk;
t[p[x]]=x;
}
void up(int x){
int k=d[x];
int pk=p[x];
while(x>1&&d[x/2]>k){
d[x]=d[x/2];
p[x]=p[x/2];
t[p[x]]=x;
x/=2;
}
d[x]=k;
p[x]=pk;
t[p[x]]=x;
}
void dijkstra(int x){
int min=2000000000;
if(nr){
min=d[1];
k=p[1];
sol[p[1]]=d[1];
d[1]=d[nr];
p[1]=p[nr];
--nr;
down(1);
}
if(min!=2000000000){
for(int i=0;i<v[k].size();++i)
if(d[t[v[k][i].first]]>min+v[k][i].second){
d[t[v[k][i].first]]=min+v[k][i].second;
up(p[t[v[k][i].first]]);
}
dijkstra(k);
}
}
int main() {
fi>>n>>m;
for(int i=1;i<=m;++i){
fi>>a>>b>>c;
v[a].push_back(make_pair(b,c));
}
int l=2*n+1;
for(int i=2;i<=l;++i)
d[i]=2000000000;
nr=n;
for (int i=1;i<=n;++i){
p[i]=i;
t[i]=i;
}
dijkstra(1);
for(int i=2;i<=n;++i)
if(sol[i]!=2000000000)
fo<<sol[i]<<' ';
else
fo<<0<<' ';
fi.close();
fo.close();
return 0;
}