Pagini recente » Cod sursa (job #2582038) | Cod sursa (job #2541239) | Cod sursa (job #668325) | Cod sursa (job #1158257) | Cod sursa (job #2427757)
#include <fstream>
#include <iostream>
#include <vector>
#define NMAX 50000
using namespace std;
ifstream f("dijkstra.in");
ofstream g("dijkstra.out");
int n, m, k, p[NMAX+10], h[NMAX+10];
long long d[NMAX+10];
vector <pair <int, int> > a[NMAX+10];
void siftUp(int x)
{
int poz = p[x];
while(poz > 1 && d[h[poz]] < d[h[poz/2]])
{ swap(p[h[poz]], p[h[poz/2]]);
swap(h[poz], h[poz/2]);
poz /= 2;
}
}
void siftDown(int x)
{
int tata = p[x], fiu = tata*2;
while(fiu <= k)
{ if(fiu < k && d[h[fiu]] > d[h[fiu+1]]) fiu++;
if(d[h[tata]] > d[h[fiu]])
{ swap(p[h[tata]], p[h[fiu]]);
swap(h[tata], h[fiu]);
tata = fiu;
fiu = fiu * 2;
}
else break;
}
}
void updateHeap(int x, int val)
{
int poz = p[x];
while(poz > 1)
{ swap(p[h[poz]], p[h[poz/2]]);
swap(h[poz], h[poz/2]);
poz /= 2;
}
d[h[1]] = val;
siftDown(h[1]);
}
void addHeap(int x, int val)
{
h[++k] = x;
d[x] = val;
p[x] = k;
siftUp(x);
}
void popHeap()
{
p[h[1]] = p[h[k]];
h[1] = h[k];
k--;
siftDown(h[1]);
}
int main()
{
f >> n >> m;
for(int i=1; i<=m; i++)
{ int nod1, nod2, cost;
f >> nod1 >> nod2 >> cost;
a[nod1].push_back(make_pair(nod2, cost));
}
addHeap(1, 0);
while(k)
{ int nod = h[1];
popHeap();
for(int j=0; j<a[nod].size(); j++)
{ int vec = a[nod][j].first;
int cost = a[nod][j].second;
if(!p[vec]) addHeap(vec, d[nod]+cost);
else if(d[nod] + cost < d[vec]) updateHeap(vec, d[nod]+cost);
}
}
for(int i=2; i<=n; i++) g << d[i] << ' ';
g << '\n';
return 0;
}