// UVa 10054 - The Necklace #include <stdio.h> #include <string.h> #include <list> using namespace std; int edge[51][51]; int n; int degree[51]; list<int> cycle; bool yet[51]; void findcycle(int x) { cycle.clear(); while (degree[x] > 0) { cycle.push_back(x); for (int i = 1; i <= n; i++) if (edge[x][i] > 0) { edge[x][i]--; edge[i][x]--; degree[i]--; degree[x]--; x = i; break; } } } int dfs(int x) { int c = 0; for (int i = 1; i <= n; i++) if (edge[x][i] > 0 && yet[i]) { yet[i] = false; c += dfs(i); } return c + 1; } int main() { int t; scanf("%d", &t); for (int tt = 1; tt <= t; tt++) { int m; scanf("%d", &m); memset(edge, 0, sizeof(edge)); memset(degree, 0, sizeof(degree)); n = 0; for (int j = 0; j < m; j++) { int c1, c2; scanf("%d %d", &c1, &c2); edge[c1][c2]++; edge[c2][c1]++; degree[c1]++; degree[c2]++; if (c1 > n) n = c1; if (c2 > n) n = c2; } int odds = 0; int realn = 0; for (int i = 1; i <= n; i++) { if ((degree[i] & 1) == 1) odds++; if (degree[i] > 0) realn++; } printf("Case #%d\n", tt); if (odds > 0) printf("some beads may be lost\n"); else { memset(yet, true, sizeof(yet)); if (dfs(n) < realn) printf("some beads may be lost\n"); else { list<int> main; main.push_back(n); for (list<int>::iterator I = main.begin(); I != main.end(); I++) { while (degree[*I] > 0) { findcycle(*I); if (!cycle.empty()) { main.insert(I, cycle.begin(), cycle.end()); for (unsigned k = 0; k < cycle.size(); k++) I--; } } } list<int>::iterator I = main.begin(); int previous = *I; for (I++; I != main.end(); I++) { printf("%d %d\n", previous, *I); previous = *I; } } } if (tt < t) printf("\n"); } return 0; }
Saturday, June 13, 2015
UVa 10054 - The Necklace
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment