Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.10.2016, 10:10   #1
ShuricFC
Пользователь
 
Регистрация: 17.09.2016
Сообщений: 25
По умолчанию Поиск цикла в графе

Помогите найти ошибку. Выдает неправильный результат!
Необходимо проверить есть ли циклы в графе, если да то вывести его в порядке обхода вершин.


Код:
#include "stdafx.h"
#include <iostream> 
#include <vector>
#include <queue>
#include "fstream"

#pragma comment(linker, "/STACK:100000000")
using namespace std;

vector<vector<int> > g;
vector<int> used, path;
int dfs(int v) {

	used[v] = 1; path.push_back(v);
	for (int i = 0; i < g[v].size(); i++)
	{
		int to = g[v][i];
		if (used[to] == 1)
		{
			path.push_back(to);
			return 1;
		}
		if (!used[to] && dfs(to)) return 1;
	}
	used[v] = 2;
	path.pop_back();
	return 0;
}


int main()
{
	ifstream f("input.txt");
	ofstream f1("output.txt");

	int n, m, a, b, i;
	cin>> n >> m;
	g.resize(n + 1); used.resize(n + 1, 0);
	for (i = 0; i < m; i++)
		cin >> a >> b;
		g[a].push_back(b);
	path.clear();
	for (i = 1; i <= n; i++)
		if (!used[i] && dfs(i)) break;
	if (i < n)
	{
		for (i = path.size() - 2; path[i] != path[path.size() - 1]; i--);
		i++; f1<<"YES", path[i++];
		for (; i < path.size(); i++)
		cout<<path[i];
		cout<< endl;
	}
	else cout<<"no";
	return 0;

}
ShuricFC вне форума Ответить с цитированием
Старый 07.10.2016, 17:10   #2
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

Думаю, что использование used[v]=2 - неверное решение.
Кроме того, в dfs вы ищете посещённую смежную с v вершину. А потом, вместо ветки else делаете новый if. Ведь логично было бы - если вершина не посещалась (не найден цикл) - попробовать перейти на эту вершину. А там уже проверять возможность цикла, как-то запомнить уже посещённую вершину, которая будет последней помещена в стек пути цикла.
И в стек пути цикла помещать вершины только после обнаружения этого цикла.
FPaul вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск кратчайшего цикла в графе Максим 116 Общие вопросы C/C++ 0 06.10.2013 14:07
Проблема с STL. Поиск эйлерова цикла на графе litviak Общие вопросы C/C++ 2 14.04.2012 10:45
алгоритмы нахождения эйлерова цикла и гамильтонова цикла в графе. Necare Помощь студентам 0 15.11.2011 18:26
Поиск Эйлерова цикла в графе Danion Помощь студентам 3 22.05.2010 18:47
найти длину кратчайшего цикла в графе Petruha-nsk Общие вопросы C/C++ 4 13.05.2009 17:08