如果图G中的一个路径包括每个边恰好一次,则路径称为欧拉路径。
如果一个回路是欧拉路径,则称为欧拉回路。(即起点终点相同的欧拉路)
有欧拉回路的称为欧拉图,有欧拉路径但无欧拉回路的称为半欧拉图。
无向图是欧拉图:当且仅当图的结点度数都为偶数。
// UVa10054 The Necklace
//zhizhao zhuo
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#define M(a) memset(a,0,sizeof(a));
using namespace std;
const int maxn= 50+10;
int du[maxn],grid[maxn][maxn];
struct node{
int u,v;
node(int u,int v):u(u),v(v){}
};
vector<node>Q;
void found(int u){
for(int i=1;i<=50;i++)if(grid[u][i]){
grid[u][i]--;grid[i][u]--;
found(i);
Q.push_back(node(u,i));
}
}
int main(){
int T,N;
scanf("%d",&T);
for(int sum=0;sum<T;sum++){
M(du);M(grid);
scanf("%d",&N);
int u,v,start;
for(int i=0;i<N;i++){
scanf("%d%d",&u,&v);
du[u]++;du[v]++;
grid[u][v]++;grid[v][u]++;
start=u;
}
if(sum)printf("\n");
printf("Case #%d\n",sum+1);
bool mark=true;
for(int i=1;i<=50;i++)if(du[i]%2!=0){mark=false;break;}
if(mark){
Q.clear();
found(start);
if(Q.size()!=N || Q[Q.size()-1].u !=Q[0].v)mark=false;
}
if(!mark)printf("some beads may be lost\n");
else for(int i=Q.size()-1;i>=0;i--)printf("%d %d\n",Q[i].u,Q[i].v);
}
return 0;
}