Pagini recente » Cod sursa (job #1667066) | Cod sursa (job #2073014) | Cod sursa (job #2443129) | Cod sursa (job #1684733) | Cod sursa (job #276257)
Cod sursa(job #276257)
#include <fstream>
#include <cstring>
using namespace std;
const unsigned int MAXN = 50001, INF=0xeeeeeeee;
ifstream in("dijkstra.in");
ofstream out("dijkstra.out");
inline unsigned int PARENT (unsigned int idx) { return (idx-1)>>1; }
inline unsigned int LEFT (unsigned int idx) { return (idx<<1)+1; }
inline unsigned int RIGHT (unsigned int idx) { return (idx+1)<<1; }
struct Nod {
unsigned int dest,cost;
Nod *n;
};
Nod *graf[MAXN];
unsigned int dist[MAXN], inheap[MAXN], heap[MAXN], heapsize;
void heap_push (unsigned int idx)
{
if (inheap[idx]) return;
inheap[idx] = 1;
unsigned int crt = heapsize++;
while (crt > 0) {
if (dist[idx] < dist[ heap[PARENT(crt)] ]) {
heap[crt] = heap[PARENT(crt)];
crt = PARENT(crt);
}
else break;
}
inheap[idx] = 1;
heap[crt] = idx;
}
unsigned int heap_pop () {
unsigned int ret = heap[0];
heap[0] = heap[--heapsize];
//heapify(0):
unsigned int crt=0;
while (LEFT(crt) < heapsize) {
unsigned int min=heap[crt],minv=crt;
if (heap[LEFT(crt)] < min) { min = heap[LEFT(crt)]; minv = LEFT(crt); }
if (RIGHT(crt) < heapsize && heap[RIGHT(crt)] < min) { min = heap[RIGHT(crt)]; minv=RIGHT(crt); }
if (minv != crt) {
heap[minv] = heap[crt];
heap[crt] = min;
crt = minv;
}
else break;
}
return ret;
}
int main ()
{
unsigned int N,M,i;
in >> N >> M;
for (i=0; i<M; ++i) {
unsigned int src;
Nod *n = new Nod;
in >> src >> n->dest >> n->cost;
n->n = graf[src];
graf[src] = n;
}
for (i=1; i<=N; ++i) {
dist[i] = INF;
inheap[i] = 0;
}
dist[1] = 0;
heap_push(1);
while (heapsize) {
unsigned int src = heap_pop();
for (Nod *nod = graf[src]; nod; nod=nod->n) {
if (dist[nod->dest] > dist[src]+nod->cost) {
//relax
dist[nod->dest] = dist[src]+nod->cost;
heap_push(nod->dest);
}
}
}
for (unsigned int i=2; i<=N; ++i) out << ((dist[i]==INF)?0:dist[i]) << ' ';
out << '\n';
return 0;
}