https://vjudge.net/problem/UVA-10054
题意:
有一种由彩色珠子连接成的项链。每个珠子的两半由不同颜色组成。相邻两个珠子在接触的地方颜色相同。现在有一些零碎的珠子,需要确认它们是否可以复原成完整的项链。
思路:
每种颜色看成一个结点,每个珠子的两半连一条有向边,这样就是欧拉回路的问题了。
最重要的一点,欧拉回路的输出一定逆序输出。
1 #include<iostream> 2 #include<algorithm> 3 #include<string> 4 #include<cstring> 5 #include<queue> 6 #include<vector> 7 using namespace std; 8 9 const int maxn = 1000 + 5; 10 11 int g[maxn][maxn]; 12 int degree[maxn]; 13 int n; 14 int MAX; 15 16 void print(int u) 17 { 18 for (int i = 1; i <= MAX; i++) 19 { 20 if (g[u][i]) 21 { 22 g[u][i]--; 23 g[i][u]--; 24 print(i); 25 printf("%d %d ", i, u); 26 } 27 } 28 } 29 30 int main() 31 { 32 //freopen("D:\txt.txt", "r", stdin); 33 int T; 34 int kase = 0; 35 scanf("%d", &T); 36 int x, y; 37 while (T--) 38 { 39 memset(g, 0, sizeof(g)); 40 memset(degree, 0, sizeof(degree)); 41 MAX = 0; 42 scanf("%d", &n); 43 44 for (int i = 0; i < n; i++) 45 { 46 scanf("%d%d", &x, &y); 47 degree[x]++; 48 degree[y]++; 49 g[x][y]++; 50 g[y][x]++; 51 MAX = max(MAX, max(x, y)); 52 } 53 54 printf("Case #%d ", ++kase); 55 bool flag = true; 56 for (int i = 1; i <= MAX; i++) 57 { 58 if (degree[i] % 2 == 1) 59 { 60 printf("some beads may be lost "); 61 flag = false; 62 break; 63 } 64 } 65 if (flag) 66 { 67 for (int i = 1; i <= MAX; i++) 68 print(i); 69 } 70 printf(" "); 71 } 72 return 0; 73 }