Pagini recente » Cod sursa (job #1980185) | Cod sursa (job #785289) | Cod sursa (job #2414589) | Cod sursa (job #2489171) | Cod sursa (job #1337063)
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;
typedef int64_t var;
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");
const var MAXN = 50001;
const var INF = 1000000001;
struct Edge {
var n, c;
Edge(var a, var b) {
n = a; c = b;
}
};
vector<Edge> G[MAXN];
var H[MAXN], POS[MAXN], COST[MAXN], n, heapsize;
void swapp(var n1, var n2) {
swap(H[n1], H[n2]);
swap(POS[H[n1]], POS[H[n2]]);
}
void heap_up(var node) {
if(node > 1 && COST[H[node/2]] > COST[H[node]]) {
swapp(node, node/2);
heap_up(node/2);
}
}
void heap_down(var node) {
if(node*2 > heapsize) return;
var next = node*2;
if(next+1 <= heapsize && COST[H[next+1]] < COST[H[next]]) {
next++;
}
if(COST[H[node]] > COST[H[next]]) {
swapp(node, next);
heap_down(next);
}
}
bool cmp(var a, var b) {
if(COST[a] > COST[b]) {
swap(POS[a], POS[b]);
return 1;
}
return 0;
}
var extract_min() {
var MIN = H[1];
swapp(1, heapsize --);
heap_down(1);
heapsize ++;
H[heapsize --] = 0;
return MIN;
}
void dijkstra(var start) {
for(var i=1; i<=n; i++) {
H[i] = i;
POS[i] = i;
COST[i] = INF;
}
COST[start] = 0;
heapsize = n;
while(heapsize) {
var node = extract_min();
for(vector<Edge>::iterator it = G[node].begin(); it != G[node].end(); ++it) {
var vec = (*it).n;
if(COST[vec] > COST[node] + (*it).c) {
COST[vec] = COST[node] + (*it).c;
heap_up(POS[vec]);
}
}
}
}
int main() {
var m, a, b, c;
fin>>n>>m;
while(m--) {
fin>>a>>b>>c;
G[a].push_back(Edge(b, c));
}
dijkstra(1);
for(var i=2; i<=n; i++) {
if(COST[i] < INF) {
fout<<COST[i]<<" ";
} else {
fout<<0<<" ";
}
}
return 0;
}