题目大意:每个节点有两个颜色,连接时颜色要相同,问能否串成项链。
解题思路:判断欧拉回路。
无向连通图G是欧拉图,当且仅当G不含奇数度结点(G的所有结点度数为偶数)。
记录一下度数,判断全偶然后输出就行。euler 这个输出的时候要逆序注意一下。
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> using namespace std; int G[100][100]; int d[100]; int N; void euler(int now) { for (int i = 1; i < 51; i++) if (G[now][i]) { G[now][i]--; G[i][now]--; euler(i); printf("%d %d\n", i, now); } } int main() { int T; scanf("%d", &T); for (int t = 0; t < T; t++) { memset(G, 0, sizeof(G)); memset(d, 0, sizeof(d)); int a, b; scanf("%d", &N); for (int i = 0; i < N; i++) { scanf("%d%d", &a, &b); d[a]++; d[b]++; G[a][b]++; G[b][a]++; } if (t) printf("\n"); printf("Case #%d\n", t+1); int i; for (i = 1; i < 51; i++) if (d[i] % 2) break; if (i != 51) printf("some beads may be lost\n"); else euler(a); } return 0; }