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\n", 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\n", ++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\n");
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("\n");
71     }
72     return 0;
73 }