#define MAX 10
#define inputfile "test.txt"
// file contents
/*
5
0 1 1 0 0
1 0 1 1 1
1 1 0 1 1
0 1 1 0 1
0 1 1 1 0
*/
#include<stdio.h>
typedef struct STACK {
int array[ 100 ] ;
int size;
} STACK;
typedef struct GRAPH {
int n;
int a[ MAX] [ MAX] ;
} DOTHI;
int DocMaTranKe( char test[ 100 ] , DOTHI * g) {
FILE* f = stdin;
/*FILE *f = fopen(test, "rt");
f = fopen(f, "r");
if (f == NULL) {
printf("Khong mo duoc file\n");
return 0;
}*/
int i, j;
for ( i= 0 ; i < g-> n; i++ ) {
for ( j= 0 ; j < g-> n; j++ ) {
fscanf ( stdin
, "%d" , & g
-> a
[ i
] [ j
] ) ; }
}
return 1 ;
}
void XuatMaTranKe ( DOTHI g) {
printf ( "So dinh cua do thi la %d\n " , g.
n ) ; printf ( "Ma tran ke cua do thi la\n " ) ; for ( int i = 0 ; i < g.n ; i++ ) {
for ( int j = 0 ; j < g.n ; j++ ) {
}
}
}
void khoitaoStack( STACK * stack) {
stack-> size = 0 ;
}
void DayGiaTriVaoStack ( STACK * stack, int value) {
if ( stack-> size + 1 >= 100 ) {
return ;
}
stack-> array[ stack-> size] = value;
stack-> size++;
}
void TimDuongDi ( DOTHI * g, STACK * stack, int i) {
for ( int j = 0 ; j < g-> n ; j++ ) {
if ( g-> a[ i] [ j] != 0 ) {
g-> a[ i] [ j] = g-> a[ j] [ i] = 0 ;
// XuatMaTranKe(*g);
TimDuongDi( g, stack, j) ;
// break;
}
}
DayGiaTriVaoStack( stack, i) ;
}
int KiemTraChuTrinhEuler ( DOTHI g) {
int i, j, bac;
for ( i = 0 ; i < g.n ; i++ ) {
bac = 0 ;
for ( j = 0 ; j < g.n ; j++ ) {
bac += g.a [ i] [ j] ;
}
if ( bac % 2 )
return 0 ;
}
int x = 0 ;
int flag = 0 ;
for ( i = 0 ; i < g.n ; i++ ) {
for ( j = 0 ; j < g.n ; j++ ) {
if ( g.a [ i] [ j] != 0 ) {
x = i;
flag = 1 ;
break ;
}
}
if ( flag== 1 )
break ;
}
DOTHI temp = g;
STACK stack;
khoitaoStack( & stack) ;
TimDuongDi( & temp, & stack, x) ;
for ( i = 0 ; i < temp.n ; i++ ) {
for ( j = 0 ; j < temp.n ; j++ ) {
if ( temp.a [ i] [ j] != 0 )
return 0 ;
}
}
if ( stack.array [ stack.size - 1 ] != stack.array [ 0 ] )
return 0 ;
printf ( "\n Chu trinh Euler: " ) ; for ( i = stack.size - 1 ; i >= 0 ; i-- )
printf ( "%d " , stack.
array [ i
] + 1 ) ; return 1 ;
}
int KiemTraDuongDiEuler ( DOTHI g) {
int i, j;
int x = 0 ;
int flag = 0 ;
int bac = 0 ;
for ( i = 0 ; i < g.n ; i++ ) {
bac = 0 ;
for ( j = 0 ; j < g.n ; j++ ) {
if ( g.a [ i] [ j] != 0 ) {
bac++;
}
}
if ( bac% 2 != 0 ) {
x = i;
flag = 1 ;
break ;
}
}
if ( flag == 0 )
return 0 ;
DOTHI temp = g;
STACK stack;
khoitaoStack ( & stack) ;
TimDuongDi( & temp, & stack, x) ;
for ( i = 0 ; i < temp.n ; i++ ) {
for ( j = 0 ; j < temp.n ; j++ ) {
if ( temp.a [ i] [ j] != 0 )
return 0 ;
}
}
if ( stack.array [ stack.size - 1 ] == stack.array [ 0 ] )
return 0 ;
printf ( "\n Duong di Euler : " ) ; for ( i = stack.size - 1 ; i >= 0 ; i-- )
printf ( "%d " , stack.
array [ i
] + 1 ) ; return 1 ;
}
int main( ) {
// makefile(5);
DOTHI g;
if ( DocMaTranKe( inputfile, & g) == 1 ) {
printf ( "Da lay thong tin do thi tu file thanh cong.\n \n " ) ; XuatMaTranKe( g) ;
printf ( "Bam 1 phim bat ki de bat dau xet tim chu trinh euler ...\n \n " ) ; if ( ! KiemTraChuTrinhEuler( g) ) {
printf ( "Khong co chu trinh Euler trong do thi cua ban\n " ) ; printf ( "\n Bam 1 phim bat ki de bat dau xet tim duong di euler ...\n " ) ; if ( ! KiemTraDuongDiEuler( g) ) {
printf ( "\n Khong co duong di Euler trong do thi cua ban \n " ) ; }
}
}
return 0 ;
}
I2RlZmluZSBNQVggMTAKI2RlZmluZSBpbnB1dGZpbGUgInRlc3QudHh0IgovLyBmaWxlIGNvbnRlbnRzCi8qCjUKMAkxCTEJMAkwCjEJMAkxCTEJMQoxCTEJMAkxCTEKMAkxCTEJMAkxCjAJMQkxCTEJMAoqLwoKI2luY2x1ZGU8c3RkaW8uaD4KdHlwZWRlZiBzdHJ1Y3QgU1RBQ0sgewoJaW50IGFycmF5WzEwMF07CglpbnQgc2l6ZTsKfSBTVEFDSzsKdHlwZWRlZiBzdHJ1Y3QgR1JBUEggewoJaW50IG47CglpbnQgYVtNQVhdW01BWF07Cn0gRE9USEk7CgppbnQgRG9jTWFUcmFuS2UoY2hhciB0ZXN0WzEwMF0sIERPVEhJICpnKSB7CglGSUxFKiBmID0gc3RkaW47CgkvKkZJTEUgKmYgPSBmb3Blbih0ZXN0LCAicnQiKTsKCWYgPSBmb3BlbihmLCAiciIpOwoJaWYgKGYgPT0gTlVMTCkgewoJCXByaW50ZigiS2hvbmcgbW8gZHVvYyBmaWxlXG4iKTsKCQlyZXR1cm4gMDsKCX0qLwoJZnNjYW5mKHN0ZGluLCAiJWQiLCAmZy0+bik7CglpbnQgaSwgajsKCWZvciAoaT0wOyBpIDwgZy0+bjsgaSsrKSB7CgkJZm9yIChqPTA7IGogPCBnLT5uOyBqKyspIHsKCQkJZnNjYW5mKHN0ZGluLCAiJWQiLCAmZy0+YVtpXVtqXSk7CgkJfQoJfQoJZmNsb3NlKGYpOwoJcmV0dXJuIDE7Cn0KCnZvaWQgWHVhdE1hVHJhbktlIChET1RISSBnKSB7CglwcmludGYoIlNvIGRpbmggY3VhIGRvIHRoaSBsYSAlZFxuIiwgZy5uKTsKCXByaW50ZigiTWEgdHJhbiBrZSBjdWEgZG8gdGhpIGxhXG4iKTsKCWZvciAoaW50IGkgPSAwOyBpIDwgZy5uOyBpKyspIHsKCQlwcmludGYgKCJcdCIpOwoJCWZvciAoaW50IGogPSAwOyBqIDwgZy5uOyBqKyspIHsKCQkJcHJpbnRmKCIlZCAiLGcuYVtpXVtqXSk7CgkJfQoJCXByaW50ZigiXG4iKTsKCX0KfQoKdm9pZCBraG9pdGFvU3RhY2soU1RBQ0sgKnN0YWNrKSB7CglzdGFjay0+c2l6ZSA9IDA7Cn0KCnZvaWQgRGF5R2lhVHJpVmFvU3RhY2sgKFNUQUNLICpzdGFjaywgaW50IHZhbHVlKSB7CglpZihzdGFjay0+c2l6ZSArIDEgPj0gMTAwKSB7CgkJcmV0dXJuOwoJfQoJc3RhY2stPmFycmF5W3N0YWNrLT5zaXplXSA9IHZhbHVlOwoJc3RhY2stPnNpemUrKzsKfQoKdm9pZCBUaW1EdW9uZ0RpIChET1RISSAqZywgU1RBQ0sgKnN0YWNrLCBpbnQgaSkgewoJZm9yIChpbnQgaiA9IDA7IGogPCBnLT5uIDsgaisrKSB7CgkJaWYgKGctPmFbaV1bal0gIT0gMCkgewoJCQlnLT5hW2ldW2pdID0gZy0+YVtqXVtpXSA9IDA7Ci8vCQkJWHVhdE1hVHJhbktlKCpnKTsKCQkJVGltRHVvbmdEaShnLHN0YWNrLGopOwovLwkJCWJyZWFrOwoJCX0KCX0KCURheUdpYVRyaVZhb1N0YWNrKHN0YWNrLGkpOwp9CgppbnQgS2llbVRyYUNodVRyaW5oRXVsZXIgKERPVEhJIGcpIHsKCWludCBpLCBqLCBiYWM7Cglmb3IgKGkgPSAwOyBpIDwgZy5uOyBpKyspIHsKCQliYWMgPSAwOwoJCWZvciAoaiA9IDA7IGogPCBnLm47IGorKykgewoJCQliYWMgKz0gZy5hW2ldW2pdOwoJCX0KCQlpZiAoYmFjICUgMikKCQkJcmV0dXJuIDA7Cgl9CglpbnQgeCA9IDA7CglpbnQgZmxhZyA9IDA7Cglmb3IgKGkgPSAwOyBpIDwgZy5uOyBpKyspIHsKCQlmb3IgKGogPSAwOyBqIDwgZy5uOyBqKyspIHsKCQkJaWYgKGcuYVtpXVtqXSAhPSAwKSB7CgkJCQl4ID0gaTsKCQkJCWZsYWcgPSAxOwoJCQkJYnJlYWs7CgkJCX0KCQl9CgkJaWYoZmxhZz09MSkKCQkJYnJlYWs7Cgl9CglET1RISSB0ZW1wID0gZzsKCVNUQUNLIHN0YWNrOwoJa2hvaXRhb1N0YWNrKCZzdGFjayk7CglUaW1EdW9uZ0RpKCZ0ZW1wLCAmc3RhY2ssIHgpOwoJZm9yIChpID0gMDsgaSA8IHRlbXAubjsgaSsrKSB7CgkJZm9yIChqID0gMDsgaiA8IHRlbXAubjsgaisrKSB7CgkJCWlmICh0ZW1wLmFbaV1bal0gIT0gMCkKCQkJCXJldHVybiAwOwoJCX0KCX0KCWlmIChzdGFjay5hcnJheVtzdGFjay5zaXplIC0gMV0gIT0gc3RhY2suYXJyYXlbMF0pCgkJcmV0dXJuIDA7CglwcmludGYoIlxuQ2h1IHRyaW5oIEV1bGVyOiAiKTsKCWZvcihpID0gc3RhY2suc2l6ZSAtIDE7IGkgPj0gMCA7IGktLSkKCQlwcmludGYoIiVkICIsc3RhY2suYXJyYXlbaV0gKyAxKTsKCXJldHVybiAxOwp9CgppbnQgS2llbVRyYUR1b25nRGlFdWxlciAoRE9USEkgZykgewoJaW50IGksajsKCWludCB4ID0gMDsKCWludCBmbGFnID0gMDsKCWludCBiYWMgPSAwOwoJZm9yIChpID0gMDsgaSA8IGcubjsgaSsrKSB7CgkJYmFjID0gMDsKCQlmb3IgKGogPSAwOyBqIDwgZy5uOyBqKyspIHsKCQkJaWYgKGcuYVtpXVtqXSAhPSAwKSB7CgkJCQliYWMrKzsKCQkJfQoJCX0KCQlpZiAoYmFjJTIgIT0gMCkgewoJCQl4ID0gaTsKCQkJZmxhZyA9IDE7CgkJCWJyZWFrOwoJCX0KCX0KCWlmKGZsYWcgPT0gMCkKCQlyZXR1cm4gMDsKCURPVEhJIHRlbXAgPSBnOwoJU1RBQ0sgc3RhY2s7CglraG9pdGFvU3RhY2sgKCZzdGFjayk7CglUaW1EdW9uZ0RpKCZ0ZW1wLCAmc3RhY2sseCk7Cglmb3IgKGkgPSAwOyBpIDwgdGVtcC5uOyBpKyspIHsKCQlmb3IgKGogPSAwOyBqIDwgdGVtcC5uOyBqKyspIHsKCQkJaWYodGVtcC5hW2ldW2pdIT0wKQoJCQkJcmV0dXJuIDA7CgkJfQoJfQoJaWYgKHN0YWNrLmFycmF5W3N0YWNrLnNpemUgLSAxXSA9PSBzdGFjay5hcnJheVswXSkKCQlyZXR1cm4gMDsKCXByaW50ZigiXG5EdW9uZyBkaSBFdWxlciA6ICIpOwoJZm9yKGkgPSBzdGFjay5zaXplIC0gMTsgaSA+PSAwIDsgaS0tKQoJCXByaW50ZigiJWQgIixzdGFjay5hcnJheVtpXSArIDEpOwoJcmV0dXJuIDE7Cn0KCmludCBtYWluKCkgewovLwltYWtlZmlsZSg1KTsKCURPVEhJIGc7CglpZiAoRG9jTWFUcmFuS2UoaW5wdXRmaWxlLCAmZykgPT0gMSkgewoJCXByaW50ZigiRGEgbGF5IHRob25nIHRpbiBkbyB0aGkgdHUgZmlsZSB0aGFuaCBjb25nLlxuXG4iKTsKCQlYdWF0TWFUcmFuS2UoZyk7CgkJcHJpbnRmKCJCYW0gMSBwaGltIGJhdCBraSBkZSBiYXQgZGF1IHhldCB0aW0gY2h1IHRyaW5oIGV1bGVyIC4uLlxuXG4iKTsKCQlpZiAoIUtpZW1UcmFDaHVUcmluaEV1bGVyKGcpKSB7CgkJCXByaW50ZigiS2hvbmcgY28gY2h1IHRyaW5oIEV1bGVyIHRyb25nIGRvIHRoaSBjdWEgYmFuXG4iKTsKCQkJcHJpbnRmKCJcbkJhbSAxIHBoaW0gYmF0IGtpIGRlIGJhdCBkYXUgeGV0IHRpbSBkdW9uZyBkaSBldWxlciAuLi5cbiIpOwoJCQlpZiAoIUtpZW1UcmFEdW9uZ0RpRXVsZXIoZykpIHsKCQkJCXByaW50ZigiXG5LaG9uZyBjbyBkdW9uZyBkaSBFdWxlciB0cm9uZyBkbyB0aGkgY3VhIGJhbiBcbiIpOwoJCQl9CgkJfQoJfQoJcmV0dXJuIDA7Cn0=