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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.01.2016, 19:42   #1
StarterX
Новичок
Джуниор
 
Регистрация: 18.06.2013
Сообщений: 1
По умолчанию Перебор всех значений связанного графа. Помогите разобраться в чём проблема...

Есть граф, элементы которого связаны по схеме:


Элементы - простые индексы от 0 до 6 включительно.
Хочу перечислить всевозможные пути, например:
Код:
0, 1
0, 1, 2, 6, 5
0, 1, 2, 6, 5, 4
0, 5, 6, 4
....
У меня правильно перебирает только первый путь, но дальше выводятся пути из несвязанных элементов. Почему это происходит? Может кто поможет пофиксить? Уже пару дней бьюсь, не могу понять в чём причина такого поведения.

Код:
void goElement( std::vector< std::vector< unsigned short > > &relationsArr, unsigned short goElementId, std::vector< unsigned short > visitedIndexesPathArr ) {

	printf( "\nВход в элемент: %i\n", goElementId );

	// Проверяем пути для посещения - если имеются для текущего элемента:
	for ( unsigned short i = 0; i < relationsArr[ goElementId ].size(); i++ ) {
	
		printf( "\t> Возможный путь: %i для %i элемента", relationsArr[ goElementId ][ i ], goElementId );
		
		bool notVisited = true; // Проверяем - не посещали ли мы relationsArr[ goElementId ][ i ] (возможный путь для посещения) уже в нашем пути
		for ( unsigned short i1 = 0; notVisited && ( i1 < visitedIndexesPathArr.size() ); i1++ )
			if ( relationsArr[ goElementId ][ i ] == visitedIndexesPathArr[ i1 ] )
				notVisited = false;
		
		if ( notVisited ) {
		
			printf( " - не посещён! Посещаем...\n" );
			
			visitedIndexesPathArr.push_back( relationsArr[ goElementId ][ i ] ); // запоминаем его как посещённый
			goElement( relationsArr, relationsArr[ goElementId ][ i ], visitedIndexesPathArr ); // Посещаем следующий
			
		} else {
		
			printf( " - посещён\n" );
		
		}
		
	}
	
	printf( "\t\tВсе посещены, финальный путь: " );
	for ( unsigned short i2 = 0; i2 < visitedIndexesPathArr.size(); i2++ )
		printf( "%i, ", visitedIndexesPathArr[ i2 ] );
	printf( "\n" );

}

int main() {
	
	std::vector< std::vector< unsigned short > > relationsArr { 
		{1,5,6},
		{0,2,6},
		{1,3,6},
		{2,4,6},
		{3,5,6},
		{0,4,6},
		{0,1,2,3,4,5}
	};
	
	std::vector< unsigned short > visitedIndexesPathArr;
	visitedIndexesPathArr.push_back( 0 );
	goElement( relationsArr, 0, visitedIndexesPathArr );

}
StarterX вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перебор всех доступных значений! AquaKlaster Общие вопросы Delphi 40 02.03.2015 12:27
Перебор всех значений двумерного массива photozaz Общие вопросы по Java, Java SE, Kotlin 4 12.10.2014 05:01
Помогите кое в чём разобраться ??? Programmer №1 Свободное общение 2 09.06.2014 10:31
Проблема с суммированием всех значений определённого столбца... jaguar8989 C/C++ Базы данных 8 18.06.2012 00:08
Пожалуйста, помогите разобраться, в чём ошибки.(Рекурсии. Паскаль) katris Помощь студентам 3 21.12.2009 12:28