Pagini recente » Cod sursa (job #1126628) | Cod sursa (job #3290033) | Cod sursa (job #712016) | Cod sursa (job #3036717) | Cod sursa (job #431884)
Cod sursa(job #431884)
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
#define N 50100
#define mp make_pair
#define pb push_back
#define ls(k) k<<1
#define rs(k) (k<<1)+1
#define father(k) k>>1
#define F first
#define S second
#define INF 0x3f3f3f3f
vector< pair< int, int > > a[N];
int n, m, k,
d[N], h[N], poz[N];
void citire(){
int i, x, y, z;
scanf("%d %d", &n, &m);
for (i = 1; i <= m; ++i){
scanf("%d %d %d", &x, &y, &z);
a[x].pb(mp(y,z));
}
}
void upheap(int w){
while (w > 1){
int r = father(w);
if ( d[ h[r] ] > d[ h[w] ] ){
swap(poz[ h[w] ], poz[ h[r] ]);
swap(h[w], h[r] );
w = r;
}
else
w = 1;
}
}
void downheap(int w){
int son;
while (w <= k){
son = w << 1;
if (son <= k){
if (son+1 <= k)
if (d[ h[ son+1 ] ] < d[ h[ son ] ])
son = son+1;
}
else
return;
if (d[ h[w] ] > d[ h[ son ] ])
{
swap(poz[h[w]], poz[h[son]]);
swap(h[w], h[son]);
w = son;
}
else
return;
}
}
void dijkstra_heap(){
int i, cost2, nod2;
for (int i = 2; i <= n; ++i)
d[i] = INF, poz[i] = -1;
poz[1] = 1; h[++k] = 1;
while (k){
int min = h[1];
swap(h[1], h[k]);
poz[h[1]] = 1;
--k;
downheap(1);
for (i = 0; i < a[min].size(); i++){
nod2 = a[min][i].F; cost2 = a[min][i].S;
if (d[nod2] > d[min] + cost2)
{
d[nod2] = d[min] + cost2;
if (poz[nod2] != -1)
upheap(poz[nod2]);
else{
h[++k] = nod2;
poz[ h[k] ] = k;
upheap(k);
}
}
}
}
}
int main(){
int i;
freopen("dijkstra.in", "r", stdin);
freopen("dijkstra.out", "w", stdout);
citire();
dijkstra_heap();
for (i = 2; i <= n; ++i)
printf("%d ", (d[i] == INF ? 0 : d[i]) );
printf("\n");
return 0;
}