Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- #include <string>
- #include <vector>
- #include <queue>
- #include <algorithm>
- using namespace std;
- void main() {
- setlocale(LC_ALL, "Russian");
- // считываем количество вершин и ребер в графе и номера вершин A и B
- int n, m, a, b;
- cin >> n >> m >> a >> b;
- // создаем вектор, в котором будем хранить граф
- vector<vector<bool>> g(n, vector<bool>(n));
- // считываем ребра
- for (int i = 0; i < n; i++) {
- int from, to;
- cin >> from >> to;
- g[from][to]=true;
- g[to][from]=true;
- }
- // создаем вектор для хранения расстояния, заполняем его большими числами
- // так же создаем вектор с предками, заполняем его -1
- vector<int> d(n, 999999), p(n, -1);
- // создаем очередь, в которой будем хранить вершины для обхода
- queue<int> q;
- // добавим начало пути в очередь
- q.push(a);
- // длина пути из вершины A в саму себя - ноль
- d[a] = 0;
- // предком у вершины А запишем саму себя для удобства
- p[a] = a;
- // пока в очереди есть элементы - выполняем поиск в ширину
- while (!q.empty()) {
- // берем вершину из очереди
- int v = q.front();
- q.pop();
- // смотрим всех её соседей
- for (int i = 0; i < n; i++) {
- // если вершина i - сосед, и пусть в неё через вершину v короче, чем тот,
- // что был известен до этого - значит мы нашли новый, более короткий путь в вершину i
- if (g[v][i] && d[v] + 1 < d[i]) {
- // обновляем расстояние, запоминаем предка и добавляем вершину i в очередь
- d[i] = d[v] + 1;
- p[i] = v;
- q.push(i);
- }
- }
- }
- // если у вершины b предок всё так же -1 - значит мы в неё не заходили,
- // и значит пути из A в B нет
- if (p[b] == -1) {
- cout << "Пути нет" << endl;
- } else {
- // если предок не -1, значит путь есть.
- // Будем идти по предкам, пока не дойдем до вершины,
- // предок которой она же сама (а такая у нас только вершина А)
- // таким образом мы восстановим путь из A в B
- vector<int> result;
- int v = b;
- while (p[v] != v) {
- result.push_back(v);
- v = p[v];
- }
- result.push_back(v);
- // выводим найденный путь в обратном порядке
- for(int i = result.size() - 1; i >=0; i--) {
- cout << result[i] << " ";
- }
- cout << endl;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement