题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=995
------------------------------------------------------------------------------------------------------------------------------------------------------------------
题意:给你n个珠子,一个珠子分为两半有两种颜色,用1到50来表示50种不同的颜色。把这些珠子串起来,两个紧挨着的珠子要满足是接触部分颜色相同。
思路:本质是无向图的欧拉回路,所有的点的度是否为偶数,且连通的图为欧拉图(存在欧拉回路)然后dfs逆序输出路径,一定要逆序。
代码:
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<string> #include<vector> #include<stack> #include<bitset> #include<cstdlib> #include<cmath> #include<set> #include<list> #include<deque> #include<map> #include<queue> using namespace std; typedef long long ll; const double PI = acos(-1.0); const double eps = 1e-6; const int N =50+5; int g[N][N],vis[N]; int deg[N]; int n; void euler(int u) { int v; for(v=1; v<=50; v++) if(g[u][v]) { g[u][v]--; g[v][u]--; euler(v); printf("%d %d\n",v,u); } } int main() { int t,T; int i; int u,v; int flag =0; scanf("%d",&T); for(t=1 ;t<=T; t++) { flag =0; for(int p =0;p<N;p++){ for(int q= 0;q<N;q++){ g[p][q]=0; } deg[p]=0; vis[p]=0; } scanf("%d",&n); for(i=1 ;i<=n; i++) { scanf("%d %d",&u,&v); deg[u]++; deg[v]++; g[u][v]++; g[v][u]++; } printf("Case #%d\n",t); for(i=1 ;i<=50; i++){ if( deg[i]%2 ) { flag =1; } } if(flag) printf("some beads may be lost\n"); else { for(i=1; i<=50; i++) euler(i); } if(t!=T) printf("\n"); } return 0; }