题意:n个珠子,每个珠子的两半由不同的颜色组成。 只有相同的颜色才能接在一起, 问能否组成一个一个项链并输出。
题解:把每个颜色看成一个点,就是判断欧拉回路
无向图欧拉回路:度为偶数的连通图(并查集)
输出路径:递归输出路径
#include<bits/stdc++.h> #define N 45000 #define mes(x) memset(x, 0, sizeof(x)); #define ll __int64 const long long mod = 1e9+7; const int MAX = 0x7ffffff; using namespace std; int mp[55][55], out[60], fa[60]; void dfs(int u){ for(int i=1;i<=50;i++) if(mp[u][i]){ mp[u][i]--;mp[i][u]--; dfs(i); printf("%d %d ", i, u); } } void init(int n){for(int i=1;i<=n;i++) fa[i] = i;} int find(int n){return fa[n] == n?n:fa[n] = find(fa[n]);} void add(int u,int v){fa[find(u)] = find(v);} int main(){ int i, n, a, b, temp, t, T; scanf("%d", &T); for(temp=1;temp<=T;temp++){ memset(mp, 0,sizeof(mp)); memset(out, 0, sizeof(out)); init(50); scanf("%d", &n); while(n--){ scanf("%d%d", &a, &b); add(a, b); mp[a][b]++;mp[b][a]++; out[a]++;out[b]++; } printf("Case #%d ", temp); for(t=0,i=1;i<=50;i++)if(out[i]&&fa[i] == i) t++; for(i=1;i<=50;i++) if(out[i]%2) break; if(t!=1||i<=50) printf("some beads may be lost "); else{ dfs(a);printf(" "); } } return 0; }