Advertisement
Guest User

Untitled

a guest
May 23rd, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.62 KB | None | 0 0
  1. // #include "stdafx.h"
  2. #include <iostream>
  3. #include <vector>
  4. #include <algorithm>
  5.  
  6. using namespace std;
  7.  
  8. struct graf {
  9.     int key; // значение
  10.     vector <int> ways; // список ребер
  11. };
  12.  
  13. int cycle_st, cycle_end;
  14. vector <graf> a;  // список вершин графа
  15. vector <int> p;
  16.  
  17. bool dfs(int v,
  18. vector <char> cl) // раскраска вершин в 2 цвета: 0 - не ходили, 1 - уже посетил
  19.  
  20. { //поиск циклов в графе
  21.                   // v - вершина из которой идем
  22.     cl[v] = 1;
  23.     for (size_t i = 0; i<a[v].ways.size(); ++i) {
  24.         int to = a[v].ways[i]; // вершина куда идем, v - откуда, i - куда
  25.         if (cl[to] == 0) { // значит что в to мы еще не ходили
  26.             p[to] = v; // в to пришли из v
  27.             if (dfs(to, cl))  return true; // запускаем рекурсию
  28.         }
  29.         else if (cl[to] == 1) { // значит что мы были уже в to и это цикл
  30.             cycle_end = v; // запоминаем конец цикла
  31.             cycle_st = to; // запоминаем начало цикла
  32.             return true; // выходим из рекурсии когда нашли цикл
  33.         }
  34.     }
  35.     cl[v] = 0; // обнуляем вершину
  36.     return false; // выходим из рекурсии без найденных циклов
  37. }
  38.  
  39. int input(int n){
  40.  
  41.     int k;
  42.     cout << "Введите количество вершин\n";
  43.     cin >> k;
  44.     for (int i = n; i < n + k; i++) {
  45.         graf point; // создание вершины графа
  46.         int m; // количество ребер
  47.  
  48.     //  int value;
  49.     //  cout << "Введите значение вершины\n";
  50.     //  cin >> value;
  51.     //  point.key = value; //добавление значения в вершину
  52.  
  53.         cout << "Введите количество ребер для вершины " << i + 1 << endl;
  54.         cin >> m; // количество ребер у вершины и значение вершины
  55.  
  56.         cout << "Введите " << m << " ребер из вершины " << i+1 << endl;
  57.         for (int i = 0; i < m; i++) { //добавление ребер из этой вершины
  58.             int x;
  59.             cin >> x;
  60.             x--;
  61.             point.ways.push_back(x);
  62.         }
  63.         a.push_back(point);
  64.     }
  65.     return n + k;
  66. }
  67.  
  68.  
  69. int main(){
  70.     setlocale(LC_ALL, "Rus");
  71.  
  72.     int n = 0;
  73.     bool flag = 0;
  74.     int otvet = 0;
  75.     while (flag == 0){
  76.         cout << "Если хотите ввести вершины, введите 1, иначе 0\n";
  77.         int x;
  78.         cin >> x;
  79.         if (x == 1){
  80.             n = input(n);
  81.         }else break;
  82.  
  83.     vector <char> cl(n, 0);
  84.     p.assign(n, -1); // обнуление массивов
  85.  
  86.     int ans = 0;
  87.  
  88.     for (int j = 0; j < n; j++) { // ищем цикл из каждой вершины
  89.  
  90.         for (int k = 0; k < n; k++) p[k] = -1, cl[k] = 0; // обнуление массивов
  91.         cycle_st = -1; // обнуление начала цикла
  92.         if (dfs(j, cl)) {} // запуск функции поиска цикла
  93.  
  94.         vector <int> cycle; // хранение вершин в цикле
  95.         for (int v = cycle_end; v != cycle_st; v = p[v]) {
  96.             cycle.push_back(v); // заполнение вершин из цикла
  97.         }
  98.  
  99.         cycle.push_back(cycle_st); // добавление начала цикл
  100.         //reverse(cycle.begin(), cycle.end());
  101.         if (cycle.size() > ans) { // поиск размера наименьшего цикла
  102.             ans = cycle.size();
  103.         }
  104.     }
  105.     otvet = max(otvet, ans);
  106.  
  107.     cout << "Максимальная длина цикла\n";
  108.     cout << otvet << endl;
  109.     }
  110.  
  111.     return 0;
  112. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement