Pagini recente » Cod sursa (job #2535357) | Cod sursa (job #3258783) | Cod sursa (job #1562106) | Cod sursa (job #3258634) | Cod sursa (job #660356)
Cod sursa(job #660356)
#include <cstdio>
#include <iostream>
#include <vector>
#include <bitset>
using namespace std;
#define MAXN 50050
#define INF 0x3f3f3f3f
int n, m, l = 0;
int d[MAXN], heap[MAXN], poz[MAXN];
vector<pair<int, int> > g[MAXN];
bitset<MAXN> viz;
typedef vector<pair<int, int> >::iterator iter;
inline int swapHeap(int i, int j)
{
int aux = heap[i];
heap[i] = heap[j];
heap[j] = aux;
poz[heap[i]] = j;
poz[heap[j]] = i;
}
inline int upHeap(int poz)
{
while ((poz >> 1) && d[heap[poz >> 1]] > d[heap[poz]]) {
swapHeap(poz, poz >> 1);
poz >>= 1;
}
}
inline int downHeap(int poz)
{
int aux = 0;
while(aux != poz) {
aux = poz;
if ((aux << 1) <= l && d[heap[aux << 1]] < d[heap[poz]]) {
poz = aux << 1;
}
if ((aux << 1) + 1<= l && d[heap[(aux << 1) + 1]] < d[heap[poz]]) {
poz = (aux << 1) + 1;
}
swapHeap(aux, poz);
}
}
inline int dijkstra()
{
for (int i = 1; i <= n; ++i) {
d[i] = INF;
heap[i] = poz[i] = i;
}
d[1] = 0, l = n;
while (l) {
int top = heap[1];
viz[top] = true;
swapHeap(1, l);
l--;
downHeap(1);
for (iter it = g[top].begin(); it != g[top].end(); ++it) {
if (!viz[it->first] && d[it->first] > d[top] + it->second) {
d[it->first] = d[top] + it->second;
upHeap(poz[it->first]);
}
}
}
}
int main ()
{
FILE* fin = fopen("dijkstra.in", "r");
FILE* fout = fopen("dijkstra.out", "w");
fscanf(fin, "%d %d\n", &n, &m);
for (int i = 0, x, y, c; i < m; ++i) {
fscanf (fin, "%d %d %d\n", &x, &y, &c);
g[x].push_back(make_pair(y, c));
}
dijkstra();
for (int i = 2; i <= n; ++i) {
fprintf (fout, "%d ", (d[i] == INF) ? 0 : d[i]);
}
fclose(fin);
fclose(fout);
return 0;
}