提交了7次,总算AC了。题目不难,就是判断下欧拉通路。注意细节。
/*
Status:AC
Title :The Necklace
*/
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <string>
#include <stack>
#include <queue>
#include <set>
#include <map>
typedef long long ll;
using namespace std;
const int INF=0x3f3f3f3f;
const int MAXN=1010;
int g[MAXN][MAXN];
int h[MAXN];//记录每个点出现的次数
bool vis[MAXN];
int n,num;
void euler(int u){
for(int v=1;v<=50;v++)if(g[u][v]>0){
g[u][v]--;
g[v][u]--;
euler(v);
printf("%d %d\n",v,u );
}
}
void dfs(int u){
num++;
vis[u]=true;
for(int v=1;v<=50;v++)if(!vis[v] && g[u][v]>0){
dfs(v);
}
}
int main()
{
int t;
scanf("%d",&t);
for(int cas=1;cas<=t;cas++){
printf("Case #%d\n",cas );
memset(g,0,sizeof g);
memset(h,0,sizeof h);
memset(vis,0,sizeof vis);
while(!s.empty())s.pop();
num=0;
int first=0;
scanf("%d",&n);
for(int i=0;i<n;i++){
int u,v;
scanf("%d %d",&u,&v);
if(first==0)first=u;
g[u][v]++;
g[v][u]++;
h[u]++;
h[v]++;
}
bool ok=true;
int cnt=0;
for(int i=1;i<=50;i++){
if(h[i])cnt++;
if(h[i]%2!=0){ //如果存在奇点
ok=false;
break;
}
}
if(!ok){
printf("some beads may be lost\n");
}
else{
dfs(first);
if(num==cnt){
euler(first);
}else{
printf("some beads may be lost\n");
}
}
if(cas<t)printf("\n");
}
return 0;
}