#include #include #include #include #include using namespace std; typedef vector> graph; void print(graph g) { for (int i = 0; i < int(g.size()); ++i) { cout << i + 1 << ": "; for (int j = 0; j < int(g[i].size()) - 1; ++j) cout << g[i][j] + 1 << ", "; if (g[i].size() > 0) cout << g[i].back() + 1; else cout << "нет смежных вершин"; cout << ";" << endl; } } void bfs( int a, int b, graph g, vector *paths, vector *used, queue *q ) { (*used)[a] = 1; q->push(a); while (q->size() > 0) { int y = q->front(); q->pop(); for (int i = 0; i < int(g[y].size()); ++i) { int node = g[y][i]; if ((*used)[node] == 0) { (*used)[node] = 1; if ((*paths)[node] == -1) (*paths)[node] = y; q->push(node); if (node == b) return; } } } } void bfs(int a, int b, graph g, vector *path) { int n = int(g.size()); vector used(n, 0); queue q; vector paths(n, -1); bfs(a, b, g, &paths, &used, &q); int cur = b; while (true) { path->push_back(cur); if (cur == a) break; if (cur == -1) { path->clear(); break; } cur = paths[cur]; } reverse(path->begin(), path->end()); } int main() { cout << "Введите количество вершин: "; int n; cin >> n; cout << "Введите количество рёбер: "; int k; cin >> k; graph g(n); cout << "o----------------------o" << endl; cout << "| Нумерация вершин с 1 |" << endl; cout << "o----------------------o" << endl; cout << "Введите рёбра (неориентированные):" << endl; for (int i = 0; i < k; ++i) { int a, b; cin >> a >> b; a--; b--; g[a].push_back(b); g[b].push_back(a); } cout << "Введённый граф:" << endl; print(g); cout << "Введите вершины, между которыми нужно найти путь:" << endl; int a, b; cin >> a >> b; a--; b--; vector path; bfs(a, b, g, &path); if (path.size() > 0) { printf("Найден путь из вершины %i в вершину %i:\n", a + 1, b + 1); for (int i = 0; i < int(path.size()) - 1; ++i) cout << path[i] + 1 << " -> "; cout << path.back() + 1 << endl; } else printf("Путь из вершины %i в вершину %i не найден.\n", a + 1, b + 1); return 0; }