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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.11.2011, 18:26   #1
Necare
Форумчанин
 
Аватар для Necare
 
Регистрация: 22.10.2010
Сообщений: 145
По умолчанию алгоритмы нахождения эйлерова цикла и гамильтонова цикла в графе.

Собственно сабж.

Как реализовать гамильтонов цикл - понятно, а что на счёт эйлерова? Если у кого есть реализация нахождения Эйлерова цикла - прошу в студию, буду благодарен.

Немного кода:

Код:
#include <stdio.h>
#include <conio.h>
#define n 10
 
int c[n] ;   // номер хода, на котором посещается вершина
int path[n]; // номера посещаемых вершин
int v0=2;    // начальная вершина
 
//Матрица смежности
int a[n][n]=
{    // 0 1 2 3 4 5 6 7 8 9
	0,1,0,0,0,0,0,0,0,1,//0
	1,0,1,1,0,0,0,0,0,0,//1
	0,1,0,1,1,0,0,0,0,0,//2
	0,1,1,0,0,0,0,1,0,0,//3
	0,0,1,0,0,1,0,0,0,0,//4
	0,0,0,0,1,0,1,1,0,0,//5
	0,0,0,0,0,1,0,1,0,0,//6
	0,0,0,0,0,1,1,0,1,0,//7
	0,0,0,0,0,0,0,1,0,1,//8
	1,0,0,0,0,0,0,0,0,1//9
};
void clearscreen()
{
for(int i=0;i<100;i++)
printf("\n");
}
 
void prnt(void)
{
int p;
        for ( p = 0 ; p<n ; p++)
	     printf("%d ", path[p] ) ;
	printf("%d ", path[0] ) ;
	printf("\n") ;
}
 
//подпрограмма нахождения гамильтонова цикла
int gamilton ( int k)
{
int v,q1=0;
    for(v=0; v<n && !q1; v++)
    {
      if(a[v][path[k-1]]||a[path[k-1]][v])
      {
	if (k==n &&  v==v0 ) q1=1;
	else if (c[v]==-1) 
        	{
		  c[v] = k ; path[k]=v; 
		  q1=gamilton (k+1) ;
		  if (!q1) c[v]=-1;	 
		} else continue;
	} 
    }	return q1;
}


 
main()
{
int j,qu=1,l;
     while(qu==1)
     {
     puts("\t\tGraph cycles.\n");
     puts("Choose from menu:\n");
     puts("1)Hamilton cycle\n");
     puts("2)Euler cycle\n");
     puts("3)Exit");
     scanf("%d",&l);     
	if(l==1)
	{
        clearscreen();
    printf("Solution of Hamiltion path:\n");
        for(j=0;j<n;j++) c[j]=-1;
		path[0]=v0 ;
      	  c[v0]=v0;
	if(gamilton (1)) prnt(); else printf("No solutions, bad graph\n");
	printf("press any key for back to menu... ");
	getch();
	clearscreen();
}
else if(l==2)
{
     clearscreen();
    printf("Solution of Eiler path path:\n");
        
}
else if (l==3)
{   clearscreen();
    printf("Press any key for exit...");
    getch();
    qu=0;
}
else
{
clearscreen();
printf("Wrong input, repeat input data...\n");
getch();
}
}
}
До последней точки с запятой в коде...
Necare вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алгоритмы с ветвлением в теле цикла. Aqua6190 Помощь студентам 1 21.12.2010 19:12
Поиск Эйлерова цикла в графе Danion Помощь студентам 3 22.05.2010 18:47
Переход от цикла к циклу не выходя из цикла (без multithreading) Qousio Общие вопросы C/C++ 2 16.05.2009 09:27
найти длину кратчайшего цикла в графе Petruha-nsk Общие вопросы C/C++ 4 13.05.2009 17:08
Нахождение эйлерова цикла, косяк vendigo Общие вопросы C/C++ 1 22.11.2007 14:14