​传送门​​​ 题意:给你n颗珠子,珠子有两面,只有两面相同才能相连,问你能否将这些珠子串成一串。
思路:就是求欧拉回路的问题,不过建图应该是无向图。所以是求无向图的欧拉回路。因为数据给的少,所以直接邻接矩阵即可。

/**
* From:
* Qingdao Agricultural University
* Created by XiangwangAcmer
* Date : 2019-10-06-21.02.40
* Talk is cheap.Show me your code.
*/
#include<bits/stdc++.h>
#include<vector>
#define mem(a,b) memset(a,b,sizeof(a))
const int maxn = 1e3 + 5;
using namespace std;
struct node {
int u, v, d, next;
} Node[maxn];
int n, m;
int vis[maxn][maxn], head[maxn], d[maxn];
int in[maxn];
int euler() {
for(int i = 1; i <= 50; i++)
if(in[i] % 2 == 1)
return 0;
return 1;
}
void dfs(int u) {
for(int v = 1; v <= 50; v++) {
if(vis[u][v] > 0) {
vis[u][v]--;
vis[v][u]--;
dfs(v);
cout << v << ' ' << u << endl;
}
}
}
bool euler_find() {
int start;
start = euler();
if(start == 0 ) {
cout << "some beads may be lost" << endl;
} else {
for(int i = 1; i <= 50; i++)
dfs(i);///判断是否全部入栈,若没有全部入栈,则说明是一个若连通图。
}
return 0;
}
int main() {
int T;
cin >> T;
int cnt=0;
while(T--) {
cin >> m;
mem(head, -1);
int ans = 0;
mem(in, 0);
mem(vis,0);
int t = m;
while(t--) {
int u, v;
cin >> u >> v;
vis[u][v]++;
vis[v][u]++;
in[u]++;
in[v]++;
}
printf("Case #%d\n",++cnt);
euler_find();
cout<<endl;
}
return 0;
}