Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <queue>
- #define INF 1e18
- using namespace std;
- struct edge { int next; ll weight; };
- using ll = long long;
- using item = pair<ll, int>;
- using graph = vector<vector<edge>>;
- vector<ll> min_ways(graph & g, int start) {
- priority_queue<item> q; // мин. точка из рассматриваемых
- vector<bool> visited(g.size(), false); // посещенные точки
- vector<ll> mins(g.size(), INF); // мин. путь к точкам
- // инициализация стартового состояния
- mins[start] = 0;
- q.push({0, start});
- while(!q.empty()) {
- int ind = q.top().second; // рассматриваемая точка
- ll curr_min = -q.top().first; // мин. путь к этой точке
- q.pop();
- if(visited[ind]) continue; // если точка уже посещена - пропускаем
- visited[ind] = true; // помечаем посещенной
- for(edge v : g[ind]) {
- ll new_weight = curr_min + v.weight;
- if(new_weight < mins[v.next]) {
- mins[v.next] = new_weight;
- q.push({-new_weight, v.next});
- }
- }
- }
- return mins;
- }
- int main() {
- int n, m, s, u, v, w;
- cin >> n >> m >> s;
- s--;
- graph g(n);
- while(m--) {
- cin >> u >> v >> w;
- u--; v--;
- g[u].push_back({.next = v, .weight = w});
- g[v].push_back({.next = u, .weight = w});
- }
- for(int64_t el : min_ways(g, s))
- cout << (el == INF ? -1 : el) << " ";
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement