[欧拉路][欧拉回路]无序字母对

题目描述

给定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  }

 


posted @ 2019-09-24 21:01  YuXiaoze  阅读(142)  评论(0编辑  收藏  举报