题目链接。
题意:
每个珠子两半有两种不同的颜色组成,相邻两珠子在接触的地方颜色相同,确认一些零碎的珠子,能否还原成完整的项链。
分析:
把每种颜色看成一个结点,珠子的两半连一条有向边,则题目转化为了欧拉回路问题。
注意:
注意编号问题,因为颜色1~50,所以最多有50个结点。
对欧拉回路输出有疑问的可参考本随笔。
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <queue> #include <stack> using namespace std; const int maxn = 50+20; const int n = 50; int deg[maxn], G[maxn][maxn], m; void euler(int u){ for(int v=1; v<=n; v++){ //这里是n而非m if(G[u][v]){ G[u][v]--; G[v][u]--; euler(v); printf("%d %d\n", v, u); } } } int main(){ int T, u, v, kase=0; cin >> T; while(T--){ cin >> m; memset(deg, 0, sizeof(deg)); memset(G, 0, sizeof(G)); for(int i=0; i<m; i++){ cin >> u >> v; G[u][v]++; G[v][u]++; deg[u]++; deg[v]++; } bool flag = true; for(int i=1; i<=n; i++){ //这里也是n非m if(deg[i] % 2 == 1) { flag = false; break; } } if(kase) putchar('\n'); if(flag){ printf("Case #%d\n", ++kase); euler(u); } else printf("Case #%d\nsome beads may be lost\n", ++kase); } return 0; }