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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.12.2010, 21:43   #1
SrgGld
Пользователь
 
Аватар для SrgGld
 
Регистрация: 23.10.2010
Сообщений: 17
Печаль Гамильтонов цикл.

Нужно было написать программу для нахождения гамильтонова цикла в графе из n вершин.
Я пока пытался писать поиск гамильтонова пути в графе, в котором заведомо есть гамильтонов цикл.
Но для n=1 и n=2 программа выдаёт не то что нужно. А для n=3 вообще иногда с переполнением стека вылетает.

Алгоритм пытался реализовать такой:
Запрашивается количество вершин.
Запрашивается матрица смежности.
В функцию передаётся первая точка.
Печатается сформированный функцией путь в массиве "c".
В функции:

если точка уже используется (содержится в пути), ретёрн фэлс

если точка - тупик (не имеет смежных не использованных) и не последняя оставшаяся - ретёрн фэлс

если точка - тупик (не имеет смежных не использованных) и последняя - добавляем её в путь и ретёрн труЪ

добавляем точку в путь

перебираем циклом смежные с ней вершины:

для каждой из них вызываем эту же функцию:

если она возвращает труЪ то ретёрн труЪ

ну, а нет так нет -передаём ей следующую подходящую точку

Код:
// Гамильтонов цикл.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <iostream>
using namespace std;

bool find(int *c, int &n, int &x)
{
	for (int i=0; i<n; i++) 
		if (c[i]==x) return true;
	return false;
}
bool deadlock(int *aj, int *c, int n)
{
	for (int i=0; i<n; i++) {
		if (aj[i] && !find(c,n,i))//при обнаружении первой неиспользованной смежной точки
			 return false;
	}
	return true;
}
bool path (int **a, int n, int i, int *c)//не правильно
{
	if (find(c,n,i))
		return false;	// точка уже используется
	if (deadlock(a[i],c,n)) //точка не имеет смежных неиспользованных точек
		if (find(c,n,n)!=n-1) //путь ещё не завершается
			return false;
		else {
			c[n-1]=i;
			return true;
		}
	c[find(c,n,n)]=i;//данная точка помещается в конец уже найденного пути
	for (int j=0; j<n; j++) {
		if (a[i][j]!=1) continue;
		if	(path(a, n, j, c))
			return true;
		//else
		//	c[find(c,n,i)+1]=n;
	}
	return false; //если не осталось смежных неиспользованных точек у данной возвращаемся назад для следующей итерации
}

int _tmain(int argc, _TCHAR* argv[])
{
	int n;
	cout<<"The program is correct for correct graph."<<endl;
	cout<<"Enter quantity of points!"<<endl;
	cin>>n;
	cout<<"Enter contiguity matrix."<<endl;
	int **a=new int * [n];
	for (int i=0; i<n; i++) {
		a[i]=new int [n];
		for (int j=0;j<n; j++)
			cin>>a[i][j];
	}
	int *c= new int [n];//массив для хранения использованных вершин в порядке обхода
	for (int i=1; i<n; i++)
		c[i]=n;//в неиспользованной части массива будут невозможные значения
	bool f=path(a, n, 0, c) ;
		for (int i=0; i<n; i++)
			cout<<c[i]<<' ';
	return 0;
}
Может, что посоветуете?

Последний раз редактировалось SrgGld; 10.12.2010 в 07:57.
SrgGld вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Цикл SsdD Помощь студентам 4 01.05.2010 23:02
Цикл по времени - Как сделать так чтобы цикл выполнялся к примеру 10 секунд ? Anarki Общие вопросы C/C++ 3 13.11.2009 19:23
Цикл с предусловием. ( цикл while) Цикл с постусловием. (цикл repeat ... until) Mr.User Помощь студентам 9 23.11.2007 01:34