rt 简单的欧拉回路问题,题目问的是给你一些带有两个颜色的珠子,然后你要把他拼成一个项链,前一个珠子的右颜色必须是下一个珠子的左颜色,最后把每个珠子的颜色输出来。
我的思路就是先判断,一个是考虑度数问题,另一个是考虑他们是不是在一个图上,如果都满足的话,就可以直接dfs输出了,但不知道哪里出了问题,望大佬解答
#include<bits/stdc++.h>
using namespace std ;
#define maxn 100100
#define int long long
int read(){
int ans = 0 , f = 1 ; char ch = getchar() ;
while ( !isdigit(ch) ){ if( ch == '-' ) f = -1 ; ch = getchar() ; }
while ( isdigit(ch) ) ans = (ans * 10) + (ch ^ '0') , ch = getchar() ;
return ans * f ;
}
#define mem(x , a) memset(x , a , sizeof(x))
int to[maxn << 1] , nxt[maxn << 1] , head[maxn] , cnt ;
void add(int u , int v){
to[++cnt] = v ; nxt[cnt] = head[u] ; head[u] = cnt ; return ;
}
int du[maxn] , vis[maxn] ;
#define fi first
#define se second
#define pii pair<int,int>
#define mp make_pair
vector<pii> ans ;
int tot ;
void dfs(int u){
for(int i = head[u] ; i ; i = nxt[i]){
int v = to[i] ;
if(!vis[i]){
ans.push_back(mp(u , v)) ;
vis[i] = 1 ;
vis[i ^ 1] = 1 ;
tot++ ;
dfs(v) ;
break ;
}
}
}
signed main(){
// freopen("test.in" , "r" , stdin) ;
// freopen("test.out" , "w" , stdout) ;
int t = read() , cs = 0 ;
while(t--){
cs++ ;
int n = read() ; int mxd = 0 ;
ans.clear() ; tot = 0 ;
mem(head , 0) ; cnt = 1 ; mem(vis , 0) ; mem(du , 0) ; mem(to , 0) ; mem(nxt , 0) ;
for(int i = 1 ; i <= n ; i++){
int u = read() , v = read() ;
add(u , v) ; add(v , u) ; du[u]++ ; du[v]++ ;
mxd = max(mxd , max(u , v)) ;
}
bool flag = 0 ;
for(int i = 1; i <= mxd ; i++){
if(du[i] & 1)
flag = 1 ; //判断度数是否合法
}
printf("Case #%lld\n" , cs) ;
if(flag){
printf("some beads may be lost\n\n") ;
continue ;
}
dfs(mxd);
if(tot != n){
printf("some beads may be lost\n\n") ; //判断是否在一个图上
continue ;
}
for(int i = 0 ; i < ans.size() ; i++)
printf("%lld %lld\n" , ans[i].fi , ans[i].se) ;
printf("\n") ;
}
}