类似于约瑟夫问题
直接用链表进行模拟
#include<iostream>
#include<cstdio>
using namespace std;
struct couple{
int num,cou;
couple *left,*right;
}cir[200001];
void init(int n){
for(int i=0;i<2*n;++i){
cir[i].num = i+1;
if(i!=0)
cir[i].left = &cir[i-1];
if(i!=2*n-1)
cir[i].right = &cir[i+1];
}
cir[0].left = &cir[2*n-1];
cir[2*n-1].right = &cir[0];
}
int main(){
int n;
while(scanf("%d",&n),n){
init(n);
for(int i=0;i<n;++i){
int tmp1,tmp2;
scanf("%d%d",&tmp1,&tmp2);
cir[tmp1-1].cou = tmp2;
cir[tmp2-1].cou = tmp1;
}
int count=0,pass=0;
couple *tmp1 = &cir[0];
while(count!=n){
if(tmp1->num == tmp1->left->cou){
tmp1->left->left->right = tmp1->right;
tmp1->right ->left = tmp1->left->left;
tmp1 = tmp1->right;
count++;
pass=0;
}
else if(tmp1->num == tmp1->right->cou){
tmp1->right->right->left = tmp1->left;
tmp1->left ->right = tmp1->right->right;
tmp1 = tmp1->right->right;
count++;
pass=0;
}
else {
tmp1 = tmp1->right->right;
pass ++;
if(pass> n+1)
break;
}
}
if(count==n) printf("Yes\n");
else printf("No\n");
}
return 0;
}