Pagini recente » Borderou de evaluare (job #2001036) | Cod sursa (job #1805664) | Monitorul de evaluare | Cod sursa (job #20146) | Cod sursa (job #1346989)
#include<fstream>
#include<vector>
#include<set>
using namespace std;
typedef int64_t var;
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");
#define MAXN 50001
#define INF ((1LL)<<62)
struct Edge {
var n, c;
Edge(var a, var b) {
n = a;
c = b;
}
};
var DIST[MAXN];
vector<Edge> G[MAXN];
var n;
struct cmp {
const bool operator () (const var &a, const var &b) const {
if(DIST[a] < DIST[b]) {
return 1;
} else if(DIST[a] == DIST[b] && a<b) {
return 1;
}
return 0;
}
};
multiset<var, cmp> SET;
void dijkstra(var start) {
for(var i=1; i<=n; i++) {
DIST[i] = INF;
}
DIST[start] = 0;
SET.insert(start);
//SET.insert(2);
while(!SET.empty()) {
var node = *(SET.begin());
SET.erase(SET.begin());
for(vector<Edge>::iterator it = G[node].begin(); it != G[node].end(); ++it) {
Edge &e = *it;
if(DIST[e.n] > DIST[node] + e.c) {
set<var>::iterator itt = SET.find(e.n);
if(itt != SET.end()) {
SET.erase(itt);
}
DIST[e.n] = DIST[node] + e.c;
SET.insert(e.n);
}
}
}
}
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++) {
fout<<((DIST[i] < INF) ? (DIST[i]) : 0)<<" ";
}
}