Pagini recente » Cod sursa (job #2680552) | Cod sursa (job #1241681) | Cod sursa (job #1724798) | Cod sursa (job #971805) | Cod sursa (job #2058209)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("dijkstra.in");
ofstream cout("dijkstra.out");
#define MAX 50005
#define INF 1000000005
int n, m, a, b, c, d[MAX], h[MAX], poz[MAX], k;
bool viz[MAX];
vector<pair<int, int> > g[MAX];
void up_heap(int x)
{
while(x > 1 and d[h[x]] < d[h[x / 2]])
{
swap(h[x], h[x / 2]);
swap(poz[h[x]], poz[h[x / 2]]);
x /= 2;
}
}
void down_heap(int x)
{
int f;
do
{
f = 0;
if(2 * x <= k and d[h[x]] > d[h[2 * x]])
{
f = 2 * x;
}
if(2 * x + 1 <= k and d[h[x]] > d[h[2 * x + 1]] and d[h[2 * x + 1]] < d[h[2 * x]])
{
f = 2 * x + 1;
}
if(f != 0)
{
swap(h[x], h[f]);
swap(poz[h[x]], poz[h[f]]);
x = f;
}
}
while(f != 0);
}
void inserare(int x)
{
h[++k] = x;
poz[x] = k;
up_heap(k);
}
void stergere(int x)
{
h[poz[x]] = h[k];
poz[h[k]] = poz[x];
k--;
up_heap(poz[x]);
down_heap(poz[x]);
}
void dijkstra()
{
for(int i = 1; i <= n; ++i)
{
d[i] = INF;
}
d[1] = 0;
for(int i = 1; i <= n; ++i)
{
inserare(i);
}
for(int i = 1; i <= n; ++i)
{
int nod = h[1];
stergere(nod);
for(int j = 0; j < g[nod].size(); ++j)
{
int v = g[nod][j].first;
int cost = g[nod][j].second;
if(d[nod] + cost < d[v])
{
d[v] = d[nod] + cost;
up_heap(poz[v]);
}
}
}
}
int main()
{
cin.sync_with_stdio(false);
cin >> n >> m;
for(int i = 1; i <= m; ++i)
{
cin >> a >> b >> c;
g[a].push_back(make_pair(b, c));
}
dijkstra();
for(int i = 2; i <= n; ++i)
{
if(d[i] == INF)
{
cout << 0 << ' ';
}
else
{
cout << d[i] << ' ';
}
}
cout << '\n';
return 0;
}