自己写的:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<algorithm>
using namespace std;
const int maxn=60;
int n,deg[maxn],pre[maxn],vis[maxn],vise[1100],num;
vector<pair<int,int> > v[maxn];
vector<pair<int,int> > ans;
int find(int x)
{
if(x==pre[x])return x;
return pre[x]=find(pre[x]);
}
void unite(int a,int b)
{
int x=find(a),y=find(b);
if(x==y)return ;
pre[x]=y;
}
void dfs(int u)
{
int len=v[u].size();
for(int i=0;i<len;i++)
{
int p=v[u][i].first,dian=v[u][i].second;
if(vise[p])continue;
vise[p]=1;
dfs(dian);
ans.push_back(make_pair(u,dian));
}
}
bool solve()
{
int cnt=0;
for(int i=1;i<=50;i++)
{
if(!vis[i])continue;
if(pre[i]==i)cnt++;
if(deg[i]%2)return false;
}
if(cnt>1)return false;
int s=0;
for(int i=1;i<=50;i++)
if(vis[i]){s=i;break;}
memset(vise,0,sizeof(vise));
ans.clear();
dfs(s);
int len=ans.size();
for(int i=len-1;i>=0;i--)cout<<ans[i].first<<" "<<ans[i].second<<endl;
return true;
}
int main()
{
freopen("in.txt","r",stdin);
int t,x,y;
scanf("%d",&t);
for(int cas=1;cas<=t;cas++)
{
scanf("%d",&n);
memset(deg,0,sizeof(deg));
memset(vis,0,sizeof(vis));
for(int i=0;i<maxn;i++)
{
pre[i]=i;
v[i].clear();
}
num=0;
for(int i=0;i<n;i++)
{
scanf("%d%d",&x,&y);
v[x].push_back(make_pair(num,y));
v[y].push_back(make_pair(num++,x));
deg[x]++,deg[y]++;
unite(x,y);
vis[x]=vis[y]=1;
}
printf("Case #%d\n",cas);
if(!solve())printf("some beads may be lost\n");
printf("\n");
}
return 0;
}
#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;
}