萌新求助欧拉回路
查看原帖
萌新求助欧拉回路
246800
wocaicai楼主2020/11/30 14:28

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") ; 
	}
}





2020/11/30 14:28
加载中...