您的位置:首页 > 其它

UVA 10054 The Necklace -欧拉回路

2018-01-08 10:05 435 查看
链接:10054

把每个珠子看作一条无向边,把珠子串在一起,符合条件的串法实际是一条欧拉回路。

欧拉路径和欧拉回路的区别是是否存在奇点,只需要事先判断一下是否存在奇点,然后就根据求欧拉路径的算法在线性时间内得到欧拉回路,如果路径上边的数量和测试数据中边的数量相等,就能串成一串,也就是考虑图的连通情况

需要注意的是,因为可以有很多相同的珠子,所以部分边可以访问多次。

#include<bits/stdc++.h>
using namespace std;

typedef pair<int,int> pii;
const int maxN=55;

int maps[maxN][maxN];
int N;

int& num(int a,int b){
if(a>b){
a+=b;
b=a-b;
a=a-b;
}
return maps[a][b];
}

void euler(int here,stack<pii>& ans){
for(int i=1;i<=50;i++){
if(num(here,i)>0){
num(here,i)--;
euler(i,ans);
ans.push(pii(here,i));
}
}
}

int main(){
int t,a,b,c,d;
int e[maxN];
cin>>t;
for(int i=1;i<=t;i++){
if(i>1)cout<<endl;
memset(maps,0,sizeof(maps));
memset(e,0,sizeof(e));
cin>>N;
cin>>a>>b;num(a,b)++;
c=a;d=b;e[a]++;e[b]++;
for(int i=1;i<N;i++){
cin>>a>>b;
num(a,b)++;
e[a]++;e[b]++;
}
bool flag=0;
for(int i=1;i<=50;i++)if(e[i]&1)flag=1;
cout<<"Case #"<<i<<endl;
if(flag){
cout<<"some beads may be lost"<<endl;
continue;
}
else{
stack<pii> ans;
euler(c,ans);
if(ans.size()<N)cout<<"some beads may be lost"<<endl;
else{
while(!ans.empty()){
cout<<ans.top().first<<" "<<ans.top().second<<endl;
ans.pop();
}
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: