完全就是哭瞎的节奏···QAQ
又是图论···
题意:有一种项链,每个珠子上有两种颜色,相同颜色的两颗珠子的两头相连,如果能连成环输出珠子的顺序,不能连成环输出"some beads may be lost"。
解法:DFS。将颜色看做点,珠子看做边,转化为欧拉回路问题。欧拉回路每个点的入度和出度和都是偶数。对颜色做DFS。加上回溯会T,不加度数判断会WA……
代码:
#include<stdio.h> #include<iostream> #include<algorithm> #include<string> #include<string.h> #include<math.h> #include<map> #include<queue> #include<set> #include<stack> #include<vector> #define ll long long using namespace std; int color[55][55];//记录不同颜色珠子的个数 int n; struct node { int a,b; node(int a,int b): a(a),b(b) {} };//珠子 vector<node> v;//项链的序列 void dfs(int c) { for(int i=1; i<55; i++) { if(color[c][i]) { color[c][i]--; color[i][c]--; dfs(i); v.push_back(node(c,i)); } } return ; } int main() { int t; scanf("%d",&t); for(int cnt=1; cnt<=t; cnt++) { v.clear(); int a,b; memset(color,0,sizeof(color)); int d[55]= {0};//度数 scanf("%d",&n); for(int i=0; i<n; i++) { scanf("%d%d",&a,&b); color[a][b]++; color[b][a]++;//一个珠子可以表示两种珠子 d[a]++; d[b]++; } int flag=1; for(int i=0; i<55; i++) { if(d[i]&1) { flag=0; break; } }//度数判断 printf("Case #%d ",cnt); if(flag) { dfs(a); if(!(n==v.size()&&v[0].b==v[v.size()-1].a))//判断首尾是否可以相连 flag=0; } if(flag) for(int i=v.size()-1; i>=0; i--) printf("%d %d ",v[i].a,v[i].b); else puts("some beads may be lost"); if(cnt<t) puts(""); } return 0; }