您的位置:首页 > 其它

Fzu2227

2016-04-16 17:03 260 查看
#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
, v
, stk[N*2] , top  ;
std::vector<std::pair<int,int> > g
;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: