//回溯的应用,又是深搜,把符合条件的和不符合条件的都穷举出来,成树。#include<stdio.h>struct Node{ int e; int s; int sign;};int c,n,si;Node map[11];void dfs(int k)//k是元组末的尾(元素列的最后一个元素的)。{ int i; if(c==n&&k==map[0].s){ si=1; return ;//符合条件的那一个 } else{ for(i=0;i<n;i++) if(map[i].sign!=1){ if(map[i].s==k){ c++; map[i].sign=1; dfs(map[i].e); c--; //回溯时要还原计数及标志。 map[i].sign=0; } if(map[i].e==k){ c++; map[i].sign=1; dfs(map[i].s); c--; map[i].sign=0; }
} }}
main(){ int i; int ca=0; while(ca++,scanf("%d",&n),n){ si=0; c=1; for(i=0;i<n;i++){ scanf("%d%d",&map[i].s,&map[i].e); map[i].sign=0; } map[0].sign=1; dfs(map[0].e); if(si==1)printf("Set #%d: YES/n",ca); else printf("Set #%d: NO/n",ca); } return 0;}