Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // #include "stdafx.h"
- #include <iostream>
- #include <vector>
- #include <algorithm>
- using namespace std;
- struct graf {
- int key; // значение
- vector <int> ways; // список ребер
- };
- int cycle_st, cycle_end;
- vector <graf> a; // список вершин графа
- vector <int> p;
- bool dfs(int v,
- vector <char> cl) // раскраска вершин в 2 цвета: 0 - не ходили, 1 - уже посетил
- { //поиск циклов в графе
- // v - вершина из которой идем
- cl[v] = 1;
- for (size_t i = 0; i<a[v].ways.size(); ++i) {
- int to = a[v].ways[i]; // вершина куда идем, v - откуда, i - куда
- if (cl[to] == 0) { // значит что в to мы еще не ходили
- p[to] = v; // в to пришли из v
- if (dfs(to, cl)) return true; // запускаем рекурсию
- }
- else if (cl[to] == 1) { // значит что мы были уже в to и это цикл
- cycle_end = v; // запоминаем конец цикла
- cycle_st = to; // запоминаем начало цикла
- return true; // выходим из рекурсии когда нашли цикл
- }
- }
- cl[v] = 0; // обнуляем вершину
- return false; // выходим из рекурсии без найденных циклов
- }
- int input(int n){
- int k;
- cout << "Введите количество вершин\n";
- cin >> k;
- for (int i = n; i < n + k; i++) {
- graf point; // создание вершины графа
- int m; // количество ребер
- // int value;
- // cout << "Введите значение вершины\n";
- // cin >> value;
- // point.key = value; //добавление значения в вершину
- cout << "Введите количество ребер для вершины " << i + 1 << endl;
- cin >> m; // количество ребер у вершины и значение вершины
- cout << "Введите " << m << " ребер из вершины " << i+1 << endl;
- for (int i = 0; i < m; i++) { //добавление ребер из этой вершины
- int x;
- cin >> x;
- x--;
- point.ways.push_back(x);
- }
- a.push_back(point);
- }
- return n + k;
- }
- int main(){
- setlocale(LC_ALL, "Rus");
- int n = 0;
- bool flag = 0;
- int otvet = 0;
- while (flag == 0){
- cout << "Если хотите ввести вершины, введите 1, иначе 0\n";
- int x;
- cin >> x;
- if (x == 1){
- n = input(n);
- }else break;
- vector <char> cl(n, 0);
- p.assign(n, -1); // обнуление массивов
- int ans = 0;
- for (int j = 0; j < n; j++) { // ищем цикл из каждой вершины
- for (int k = 0; k < n; k++) p[k] = -1, cl[k] = 0; // обнуление массивов
- cycle_st = -1; // обнуление начала цикла
- if (dfs(j, cl)) {} // запуск функции поиска цикла
- vector <int> cycle; // хранение вершин в цикле
- for (int v = cycle_end; v != cycle_st; v = p[v]) {
- cycle.push_back(v); // заполнение вершин из цикла
- }
- cycle.push_back(cycle_st); // добавление начала цикл
- //reverse(cycle.begin(), cycle.end());
- if (cycle.size() > ans) { // поиск размера наименьшего цикла
- ans = cycle.size();
- }
- }
- otvet = max(otvet, ans);
- cout << "Максимальная длина цикла\n";
- cout << otvet << endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement