1、uva 10054 The Necklace(欧拉回路)
题意:有n个具有两种颜色的珠子,现在需要将其串起来,要求前后珠子相邻颜色相同。
思路:以每一种颜色为结点,以珠子为边,判断是否联通和是否存在欧拉回路。
1 #include<iostream> 2 #include<vector> 3 #include<queue> 4 #include<cstring> 5 using namespace std; 6 const int maxn = 60; 7 vector<int>mp[maxn]; 8 //判断图是否联通 9 bool vis[maxn]; 10 bool BFS(int rt) 11 { 12 memset(vis, 0, sizeof(vis)); 13 for (int i = 1; i <= 50; i++) if (mp[i].size() == 0) vis[i] = true; 14 queue<int>q; 15 q.push(rt); 16 vis[rt] = true; 17 while (!q.empty()) 18 { 19 int u = q.front(); 20 q.pop(); 21 int sz = mp[u].size(); 22 for (int i = 0; i < sz; i++) 23 { 24 if (!vis[mp[u][i]]) 25 { 26 vis[mp[u][i]] = true; 27 q.push(mp[u][i]); 28 } 29 } 30 } 31 for (int i = 1; i <= 50; i++) if (!vis[i]) return false; 32 else return true; 33 } 34 35 // 输出欧拉回路,思路是先找出一个环,然后将此环从图中删除,继续从下一个起点开始找环,将这些环在公 36 // 共端点连接起来即构成一条欧拉回路。可以使用递归来实现。 37 int isconnect[maxn][maxn]; 38 void Print_Eulerian_cycle(int rt) 39 { 40 int sz = mp[rt].size(); 41 int to=-1; 42 for (int i = 0; i < sz; i++) 43 { 44 if (isconnect[rt][mp[rt][i]]) 45 { 46 isconnect[rt][mp[rt][i]]--; 47 isconnect[mp[rt][i]][rt]--; 48 Print_Eulerian_cycle(mp[rt][i]); 49 printf("%d %d ",mp[rt][i],rt); 50 } 51 } 52 } 53 int main() 54 { 55 int t; 56 scanf("%d", &t); 57 int Case = 1; 58 while (t--) 59 { 60 int n; 61 scanf("%d", &n); 62 memset(isconnect, 0, sizeof(isconnect)); 63 for (int i = 0; i < maxn; i++) mp[i].clear(); 64 while (n--) 65 { 66 int u, v; 67 scanf("%d%d", &u, &v); 68 mp[u].push_back(v); 69 mp[v].push_back(u); 70 isconnect[u][v]++; 71 isconnect[v][u]++; 72 } 73 bool flag; 74 int st; 75 for (int i = 1; i <= 50; i++) 76 { 77 if (mp[i].size()) 78 { 79 st = i; 80 flag = BFS(i); 81 break; 82 } 83 } 84 if (flag) 85 { 86 for (int i = 1; i <= 50; i++) 87 { 88 if (mp[i].size() % 2 == 1) 89 {//判断每个点的度数是否都是偶数 90 flag = false; 91 break; 92 } 93 } 94 } 95 printf("Case #%d ", Case++); 96 if (!flag) printf("some beads may be lost "); 97 else 98 { 99 Print_Eulerian_cycle(st); 100 } 101 if (t) printf(" "); 102 } 103 return 0; 104 }