有向图是否具有欧拉通路或回路的判定:
欧拉通路:图连通;除2个端点外其余节点入度=出度;1个端点入度比出度大1;一个端点入度比出度小1 或 所有节点入度等于出度
欧拉回路:图连通;所有节点入度等于出度
#include<stdio.h> #include < string .h> #define MAX 27 int in [MAX], out [MAX]; int visit[MAX],father[MAX]; int find( int index) { if (index==father[index]) return index; else return find(father[index]); } int main( void ) { int t,n; int i,j; int s,e; char str[ 1001 ]; scanf( " %d " ,& t); while (t-- ) { scanf( " %d " ,& n); memset(visit, 0 , sizeof (visit)); memset( in , 0 , sizeof ( in )); memset( out , 0 , sizeof ( out )); for (i= 0 ;i<MAX;i++) father[i]= i; for (i= 0 ;i<n;i++ ){ scanf( " %s " ,str); int len= strlen(str); s =str[ 0 ]- ' a ' ,e=str[len- 1 ]- ' a ' ; father[s] =father[e]= find(s); visit[s] =visit[e]= 1 ; out [s]++; in [e]++ ; } // 判断改图是否连通 int r= 0 ; for (i= 0 ;i<MAX;i++ ){ if (visit[i]&&i==father[i]) r++ ; } if (r> 1 ){ // aba abc printf( " The door cannot be opened.\n " ); continue ; } int x,y,z,h; x =y=z=h= 0 ; for (i= 0 ;i<MAX;i++ ){ if (visit[i]){ if ( out [i]- in [i]== 1 == 1 ) x++ ; else if ( in [i]- out [i]== 1 )y++ ; else if ( in [i]== out [i]) z++ ; else h++ ; } } if (h== 0 &&((x== 1 &&y== 1 )||(x== 0 ||y== 0 ))) printf( " Ordering is possible.\n " ); else printf( " The door cannot be opened.\n " ); } return 0 ; }