Pagini recente » Cod sursa (job #2933422) | Cod sursa (job #3147924) | Cod sursa (job #2962821) | Cod sursa (job #1629199) | Cod sursa (job #2283912)
#include <fstream>
#include <vector>
std::ifstream cin("dijkstra.in");
std::ofstream cout("dijkstra.out");
#define it std::vector<std::pair<int,int>>::iterator
const int INF = 1<<30;
const int maxn = 50050;
std::vector<std::pair<int,int>> g[maxn];
int n,m,k;
int h[maxn],poz[maxn],d[maxn];
void swap(int a,int b){int aux;aux=h[a];h[a]=h[b];h[b]=aux;}
void dijkstra_wHeap();
void downheap(int);
void upheap(int);
int main()
{
int x,y,z;
cin>>n>>m;
for(;--m;){
cin>>x>>y>>z;
g[x].push_back(std::make_pair(y,z));
}
dijkstra_wHeap();
for(int i=2;i<=n;i++){
x=((d[i]==INF)?0:d[i]);
cout<<x<<' ';
}
cout<<'\n';
return 0;
}
void dijkstra_wHeap(){
for(int i=2;i<=n;i++)
d[i]=INF, poz[i]=-1;
d[1]=0;
h[++k]=1;
poz[1]=1;
while(k>0){
int mini=h[1];
poz[mini]=0;
swap(k,1);
poz[h[1]]=1;
--k;
downheap(1);
for(it xd=g[mini].begin();xd!=g[mini].end();xd++){
if(d[xd->first]>d[mini]+xd->second){ //xd pointer ->
d[xd->first]=d[mini]+xd->second; //nu se foloseste .
if(poz[xd->first]>0)
upheap(poz[xd->first]);
else{
h[++k]=xd->first;
poz[xd->first]=k;
upheap(k);
}
}
}
}
}
void upheap(int x){
while(x>>1&&d[h[x>>1]]>d[h[x]]){
poz[h[x>>1]]=x;
poz[h[x]]=x>>1;
swap(x,x>>1);
x>>=1;
}
}
void downheap(int x){
int f=0;
while (f!=x){
f=x;
if(((x<<1)<=k)&&d[x<<1]<d[h[f]])
x=(f<<1);
if((((x<<1)+1)<=k)&&d[(x<<1)+1]<d[h[f]])
x=(f<<1)+1;
poz[h[x]]=f;
poz[h[f]]=x;
swap(x,f);
}
}