uva 10054

还是欧拉回路,师兄帮忙,嘿嘿.........

#include <iostream> #include <cstring> using namespace std ; const int maxn = 50 + 10 ; int G[maxn][maxn] ; int d[maxn] ; bool visit[maxn] ; int cnt ; int node ; int bu ; void init() { memset( G , 0 , sizeof( G ) ) ; memset( d , 0 , sizeof( d ) ) ; memset( visit , false , sizeof( visit ) ) ; cnt = 0 ; node = 0 ; bu = 0 ; return ; } bool check( int max ) { bool flag = false ; for( int i = 0 ; i <= max ; ++i ) if( d[i] ) { bu = i ; node++ ; if( d[i] & 1 ) { flag = true ; break ; } } return flag ; } void dfs( int n , int u ) { cnt++ ; visit[u] = true ; for( int i = 0 ; i <= n ; ++i ) if( !visit[i] && G[u][i] ) dfs( n , i ) ; return ; } void euler( int n , int u ) { for( int v = 0 ; v <= n ; ++v ) if( G[u][v] ) { G[v][u]-- ; G[u][v]-- ; euler( n , v ) ; cout << v << " " << u << endl ; } return ; } int main() { int ncase ; cin >> ncase ; for( int icase = 0 ; icase < ncase ; icase++ ) { init() ; int n ; cin >> n ; int max = -1 ; for( int i = 0 ; i < n ; ++i ) { int u , v ; cin >> u >> v ; //找到最大的颜色 if( max < u ) max = u ; if( max < v ) max = v ; //每个珠子出现一次就加一 G[u][v]++ ; G[v][u]++ ; d[u]++ ; d[v]++ ; } if( icase ) cout << endl ; cout << "Case #" << icase + 1 << endl ; bool flag = check( max ) ; if( flag ) cout << "some beads may be lost" << endl ; else { dfs( max , bu ) ; if( cnt != node ) cout << "some beads may be lost" << endl ; else euler( max , bu ) ; } } return 0 ; }

 

你可能感兴趣的:(uva 10054)