Fzu2227

#include <iostream>
#include <string>
#include <string.h>
#include <vector>
#include <stdio.h>
#include <algorithm>
#include <map>


std::vector<int> num ;
std::map<int , int> Id ;
const int N = 100008 ;
int u[N] , v[N] , stk[N*2] , top  ;
std::vector<std::pair<int,int> > g[N] ;
bool mark[N*2] ;
void dfs(int now){
     for(std::vector<std::pair<int,int> >::iterator it = g[now].begin() ; it != g[now].end() ; it++){
         if (! mark[it->second]){
            mark[it->second] = 1;
            dfs(it->first);
            stk[++top] = it->first ;
         }
     }
}

int deg[N*2] ;

int main()
{
    int n ;
    while(scanf("%d",&n) != EOF){

        num.clear() ;
        for(int i = 0 ;  i < n ; i++){
            scanf("%d%d" , &u[i] , &v[i]) ;
            num.push_back(u[i]) ;
            num.push_back(v[i]) ;
        }
        std::sort(num.begin() , num.end()  ) ;
        int m = std::unique(num.begin() , num.end()) - num.begin() ;
        Id.clear() ;
        for(int i = 0 ; i < m ; i++){
            Id[num[i]] = i ;
        }
        std::fill(deg , deg+m , 0) ;
        for(int i = 0 ; i < m ; i++) g[i].clear() ;
        for(int i = 0 ; i < n ; i++){
            int uu = Id[u[i]] ;
            int vv = Id[v[i]] ;
            g[uu].push_back(std::make_pair(vv,i) ) ;
            g[vv].push_back(std::make_pair(uu,i) ) ;
            deg[uu]++ ;
            deg[vv]++ ;
        }

        int start = 0 ;
        for(int i = 0 ; i < m ; i++){
            if(deg[i] & 1){
                start = i ;
                break ;
            }
        }

        for(int i = 0 ; i < m ; i++) std::sort(g[i].begin() , g[i].end()) ;
        std::fill(mark , mark + m , 0) ;
        top = 0 ;
        dfs(start) ;
        printf("%d" , num[start]) ;
        for(int i = top ; i >=1  ; i--) printf(" %d" , num[stk[i]]) ;
        puts("") ;
    }
    return 0;
}

你可能感兴趣的:(Fzu2227)