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
| struct Dijstra { struct node { int to, w; }; struct he { int id, dis;
bool operator<(const he other) const { return this -> dis > other.dis; }
}; int len; std::vector<std::vector<node>> edges; std::vector<int> dist; std::vector<bool> st;
Dijstra() {} Dijstra(int n) { init(n); }
void init(int n) { len = n; edges.resize(n); dist.resize(n, INF); st.resize(n, 0); }
void add(int u, int v, int w) { edges[u].push_back({v, w}); }
void dijstra(int start = 0) { dist.assign(len, INF); st.assign(len, 0); dist[start] = 0; std::priority_queue<he> heap; heap.push({start, 0});
while (heap.size()) { auto [u, dis] = heap.top(); heap.pop();
if (st[u]) { continue; } st[u] = true;
for (auto [v, w] : edges[u]) { if (dist[v] > dis + w) { dist[v] = dis + w; heap.push({v, dist[v]}); } } }
}
};
|