题意:
给你n个珠子,一个珠子分为两半有两种颜色,用1到50来表示50种不同的颜色。把这些珠子串起来,两个紧挨着的珠子要满足一个条件就是接触的那部分颜色要相同
例如(1,2)(2,4),两个珠子的接触部分颜色相同都为2。当然,因为珠子最后是连成环的,第一个珠子和最后一个珠子也会接触,也要买满足这个条件
先输入T,有T组数据
输入n,有n个珠子
下面n行每行两个数字表示这个珠子的两个颜色,然后问你能不能连成一条链,能的话输出任意一种连接情况即可,不能的话输出失败
分析:
欧拉回路裸题,dfs判断欧拉回路,逆序输出答案。
欧拉回路:每个点的度数(入度/出度)都是偶数,图连通,每个点入度等于出度。
代码:
using namespace std;
#define fi first
#define se second
typedef long long ll;
typedef pair<int, int>pii;
const int INF = 0x3f3f3f3f;
const int N = 50+9;
int cnt,g[N][N],in[N];;
pii ans[1000];
void dfs(int u) {
for(int v=1; v<=50; v++)
if(g[u][v]) {
g[u][v]--;
g[v][u]--;
dfs(v);
ans[cnt++]=make_pair(u,v);
}
}
int main() {
//freopen("f.txt","r",stdin);
int n,u,v,start;
int T;
scanf("%d",&T);
for(int cas=1; cas<=T; cas++) {
memset(g,0,sizeof(g));
memset(in,0,sizeof(in));
scanf("%d",&n);
for(int i=0; i<n; i++) {
scanf("%d%d",&u,&v);
g[u][v]++;
g[v][u]++;
in[u]++;
in[v]++;
start=u;
}
bool flag=1;
for(int i=1; i<=50; i++)
if(in[i]&1)flag=0;
if(flag) {
cnt=0;
dfs(start);
if(cnt!=n||ans[0].se!=ans[cnt-1].fi)flag=0;
}
if(cas>1)printf("\n");
printf("Case #%d\n",cas);
if(!flag)puts("some beads may be lost");
else for(int i=cnt-1; i>=0; i--)printf("%d %d\n",ans[i].fi,ans[i].se);
}
return 0;
}