-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathdijkstra.cpp
86 lines (72 loc) · 1.57 KB
/
dijkstra.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <fstream>
#include <iostream>
#include <vector>
#include <limits>
#include <utility>
#include <set>
using namespace std;
ifstream in("dijkstra.in");
ofstream out("dijkstra.out");
typedef vector<unsigned> vec_u;
typedef pair<unsigned,unsigned> pair_u;
typedef vector<pair_u> vec_pair_u;
const unsigned INF = numeric_limits<unsigned>::max();
class Graph {
public:
Graph(size_t n) :
nNodes(n)
{
adLs.resize(n);
}
void addEdge(unsigned from, unsigned to, unsigned cost) {
adLs[from].push_back(pair_u(to,cost));
}
vec_u fromOnetoAll(unsigned s) {
vec_u dist(nNodes,INF);
set<pair_u> Q;
Q.insert(pair_u(0,s));
while(!Q.empty()) {
pair_u top = *Q.begin();
Q.erase(Q.begin());
unsigned v1 = top.second;
for(vec_pair_u::const_iterator it = adLs[v1].begin(); it != adLs[v1].end(); ++it) {
unsigned v2 = it->first;
unsigned cost = it->second;
if(dist[v2] > dist[v1] + cost) {
if(dist[v2] != INF)
Q.erase(Q.find(pair_u(dist[v2],v2)));
dist[v2] = dist[v1] + cost;
Q.insert(pair_u(dist[v2],v2));
}
}
}
for(size_t i = 0; i < nNodes; ++i) {
if(dist[i]==INF)dist[i] = 0;
else dist[i]++;
}
return dist;
}
size_t getNNodes() {
return nNodes;
}
private:
vector<vec_pair_u> adLs;
size_t nNodes;
};
int main() {
size_t n;
in >> n;
Graph graph(n);
size_t m;
in >> m;
for(size_t i = 0; i < m; ++i) {
unsigned a,b,cost;
in >> a >> b >> cost;
graph.addEdge(a-1,b-1,cost);
}
vec_u dists = graph.fromOnetoAll(0);
for(size_t i = 1; i < graph.getNNodes(); ++i) {
out << dists[i] << ' ';
}
return 0;
}