[欧拉路][欧拉回路]无序字母对
题目描述
给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒)。请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现。
输入格式
第一行输入一个正整数n。
以下n行每行两个字母,表示这两个字母需要相邻。
输出格式
输出满足要求的字符串。
如果没有满足要求的字符串,请输出“No Solution”。
如果有多种方案,请输出前面的字母的ASCII编码尽可能小的(字典序最小)的方案
输入输出样例
输入 #1
4 aZ tZ Xt aX
输出 #1
XaZtX
说明/提示
【数据规模与约定】
不同的无序字母对个数有限,n的规模可以通过计算得到。
在无向图中
判断欧拉回路,只要每个点的度数均为偶数即可。
判断欧拉路径,如果有且仅有两个点的度数为奇数,就会存在一条从这两个中的一个到达另一个的欧拉路径。
所以在输入是存储每个点的度数,判断是否满足条件。如果不满足,即没有欧拉回路/路径,就直接输出No Solution。
如果存在欧拉路径,直接把字典序较小的那个有奇数度数的点当做起点,进行dfs。
如果存在欧拉回路,就选择一个字典序最小的点当做起点,进行dfs。
找欧拉路dfs时删边即可
1 #include<cstdio> 2 using namespace std; 3 const int N=130; 4 int n,deg[N]; bool a[N][N]; char ans[N*N],s[15]; 5 void dfs(int x) 6 { for(int y=0;y<N;y++) 7 if(a[x][y]) 8 {a[x][y]=a[y][x]=0; dfs(y); 9 } 10 ans[n--]=x; 11 } 12 int main() 13 { 14 scanf("%d",&n); 15 for(int i=0;i<n;i++) 16 {scanf("%s",s); 17 a[s[0]][s[1]]=a[s[1]][s[0]]=1; deg[s[0]]++; deg[s[1]]++; 18 } 19 char fir=0; int cnt=0; 20 for(int i=0;i<N;i++) 21 if(deg[i]&1) {cnt++; if(!fir) fir=i;} 22 23 if(!fir) for(int i=0;i<N;i++)if(deg[i]) {fir=i; break;} 24 if(cnt && cnt!=2) {printf("NO SOLUTION!!!!"); return 0;} 25 dfs(fir); printf("%s",ans); 26 return 0; 27 }