您的位置:首页 > 其它

UVA 10054 The Necklace(欧拉回路)

2016-11-09 20:06 447 查看
输出不能顺序输出,如果环中还有一个小环,那么dfs的时候就会回溯,那样的话顺序输出就会错误,但是逆序输出就能保证首位相接。#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<stack>
using namespace std;
const int maxc=50+5;
int degree[maxc],vis[maxc][maxc];
#define ss(x) scanf("%d",&x)
#define rep(i,a,b) for(int i=(a);i<(b);i++)
int n;
vector<pair<int,int> > ans;
void euler(int u)
{
for(int v=1;v<=50;v++) if(vis[u][v]){
vis[u][v]--;vis[v][u]--;
euler(v);
ans.push_back(make_pair(u,v));
}
}
int main()
{
int kase=0;
int t;ss(t);
while(t--)
{
memset(degree,0,sizeof(degree));
memset(vis,0,sizeof(vis));
ans.clear();
ss(n);
int u=0,v=0;
rep(i,0,n){
scanf("%d%d",&u,&v);
degree[u]++;degree[v]++;
vis[u][v]++;vis[v][u]++;
}
bool ok=true;
for(int i=1;i<=n;i++) if(degree[i]%2==1) {ok=false;break;}
if(kase) printf("\n");
printf("Case #%d\n",++kase);
if(ok) {euler(u);if(ans.size()!=n) ok=false;}
if(ok==false) printf("some beads may be lost\n");
else for(int i=n-1;i>=0;i--) printf("%d %d\n",ans[i].first,ans[i].second);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: