fork download
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4.  
  5. int n,m,a,b,count = 0;
  6. vector<vector<int> > graf; vector<int> ver; vector<int> family; bool ok = false; vector<int> ans; vector<bool> popa;
  7.  
  8. int bfs(int beg, int end){ // функция которая добавляет вершины в вектор вершин,которые мы просмотрим,и помечает их как уже проверенные
  9. count++;
  10. if(beg == end){
  11. ok = true;
  12. return 1;
  13. }else{
  14. for(int i = graf[beg].size() - 1;i >= 0;i--){
  15. if(!popa[graf[beg][i]]){
  16. ver.push_back(graf[beg][i]);
  17. family.push_back(beg);
  18. popa[graf[beg][i]] = true;
  19. }
  20. }
  21. }
  22. return 0;
  23. }
  24.  
  25. int main() {
  26. ios::sync_with_stdio(false);
  27. cin >> n >> m;
  28. cin >> a >> b;
  29. for(int i = 0 ; i <= n; i++){ // создаем векто ввекторов
  30. graf.push_back(ans);
  31. popa.push_back(false);
  32. }
  33. ver.push_back(a);family.push_back(a);
  34. for(int i = 0; i < m; i++){ //в вектор вершины добавляем те вершины,с которым она связанна
  35. int x,y;
  36. cin >> x >> y;
  37. if(x != y){ // проверка на петлю
  38. graf[x].push_back(y);
  39. graf[y].push_back(x);
  40. }
  41. }
  42. if(!graf[a].empty()){ //если вершины начала не изолированна
  43. while(!ok && count < ver.size() ){ //цикл,пока мы не найдем конечную вершину,или если мы не прошли все вершины в векторе "плана"
  44. if(bfs(ver[count],b)){ //если мы нашли выход,то начать восстанавливать пути
  45. count--;// Нам надо начать с последней вершины,а это count - 1 вершина
  46. int p = 1; //Новая переменная,которая нужна,для нахождения первого вхождения "отца" данной вершины
  47. ans.push_back(b);//вектор ответа
  48. while(ver[count] != a){ // пока не дошли до начальной вершины
  49. while(ver[p] != family[count]){//двигаемся слева пройденных по вектору вершин плана,и ищем первое вхождение вершины ОТЦА
  50. p++;
  51. }
  52. ans.push_back(ver[p]);//добавляем в ответ вершину,из которой мы попали в предыдущую (отца)
  53. count = p;// теперь ищем отца отца и так далее,пока не дойдем до начальной вершины
  54. p = 1;
  55. }
  56. }
  57. }
  58. if(ans.size() > 0){ // если вектор ответа не пуст(имеет хотябы одну вершины из пути)
  59. cout << ans.size()-1 << endl;
  60. for(int i = ans.size()-1; i >= 0; i--){
  61. cout << ans[i] << " "; // выводим ответ справа на лево,так сказано в условии
  62. }
  63. }else{ // иначе -1
  64. cout << "-1\n";
  65. }
  66. }else{//если начальная вершина изолирована,то сразу выводим -1
  67. cout << "-1\n";
  68. }
  69. return 0;
  70. }
Success #stdin #stdout 0s 4192KB
stdin
4 5
1 4
1 3
3 2
2 4
2 1
2 3
stdout
2
1 2 4