|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
15.06.2012, 18:21 | #1 |
Новичок
Джуниор
Регистрация: 15.06.2012
Сообщений: 1
|
Алгоритм нахождения Эйлерова цикла
#include<stdio.h>
#include<conio.h> #include<math.h> #define NMAX 20 int prov2(int n,int g[][NMAX]) { int i,j,t=0,k=0; for (i=0;i<n;i++) {for (j=0;j<n;j++) k+=g[i][j]; if (k%2!=0) t++; if (t>2) return 7; k=0; } return 0; } void Poisk(int v, int n,int g[][NMAX], int *no, int res[NMAX]) { int stack[NMAX]={0},ns=0,V=0,i,j; stack[ns++]=v; while (ns!=0) { V=0; v=stack[ns-1]; for (i = 0; i < n; i++) V+=g[v][i]; if (V==0) ns--,res[(*no)++]=v; else { i=0; while (g[v][i]!=1) i++; g[v][i]=0; g[i][v]=0; stack[ns++]=i; } } } int VVOD(int *n,int g[][NMAX]) { int i,j; FILE *f; if ((f=fopen("<адрес входного файла>","r"))!=NULL) { fscanf(f,"%d",n); if ((*n<2)||(*n>20)) return 5; if (feof(f)) return 4; for (i=0;i<(*n);i++) for (j=0;j<(*n);j++) fscanf(f,"%d",&g[i][j]); } else return 3; return 0; } int marker(int n, int massiv[], int metka) { int result=0; for (int i = 0; i < n; i++) if (massiv[i]==metka) result++; return result; } int prov1(int n,int g[][NMAX]) { int v=0; int *massiv=(int*)malloc(sizeof(int)*n) ; for (int i=0; i < n; i++) massiv[i]=1; massiv[v]=2; while (marker(n,massiv,2)!=0) { for (int i=0; i < n; i++) if (massiv[i]==2){ v=i; break;} for (int i=0; i < n; i++) printf("%d\n",massiv[i]); printf("\n"); massiv[v]=3; for (int j=0; j < n; j++) if ((g[v][j]==1)&&(massiv[j]==1)) massiv[j]=2; } for (int i=0; i < n; i++) if (massiv[i]==1) return 6; return 0; } void Vyvod(int pr) { switch (pr) { case 5: {printf("nedopustimoe kolichestvo vershin");getch();break;} case 3: {printf("net vhodnogo faila");getch();break;} case 4: {printf("file pust");getch();break;} case 6: {printf("net ejlerova puty: graf nesvjazniy");getch();break;} case 7: {printf("net ejlerova puty: vershin nechetnoy stepeny bolee2");getch();break;} default: ; } } int main() { int i,j,k,n,no=0,g[NMAX][NMAX],t[NMAX][NMAX],res[NMAX]; if (VVOD(&n,g)!=0) {Vyvod(VVOD(&n,g));return 0;} if (prov1(n,g)==6) {Vyvod(prov1(n,g));return 0;} if (prov2(n,g)==7) {Vyvod(prov2(n,g));return 0;} j=0; while (j<n) { no=0; for (i = 0; i < n; i++) for (k = 0; k < n; k++) t[i][k]=g[i][k]; Poisk(j,n,t,&no,res); k=0; for (i = 0; i < no-1; i++) { if (g[res[i]][res[i+1]]==1) k++; } if (k==no-1) break; printf ("\nno= %i\n",no); j++; } for (i = no-1; i >=0; i--) { printf("%d\n", res[i]); } getch(); return 0; } //-------------------------------------------------------------------------Подскажите, правильный ли код, и если не сложно, то скиньте экзэшник. Буду очень благодарен) |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Построение Эйлерова цикла | Stellart | Помощь студентам | 1 | 06.06.2012 17:54 |
Проблема с STL. Поиск эйлерова цикла на графе | litviak | Общие вопросы C/C++ | 2 | 14.04.2012 10:45 |
алгоритмы нахождения эйлерова цикла и гамильтонова цикла в графе. | Necare | Помощь студентам | 0 | 15.11.2011 18:26 |
Поиск Эйлерова цикла в графе | Danion | Помощь студентам | 3 | 22.05.2010 18:47 |
Нахождение эйлерова цикла, косяк | vendigo | Общие вопросы C/C++ | 1 | 22.11.2007 14:14 |