【洛谷】P1341 无序字母对(欧拉回路)
题目
传送门:QWQ
分析
快把欧拉回路忘光了。
欧拉回路大概就是一笔画的问题,可不可以一笔画完全图。
全图有欧拉回路当且仅当全图的奇数度数的点有0或2个。
2个时是一个点是起点,另一个是终点。
本题也差不多,把给的每个字母对中的两个字母连边。然后跑欧拉回路
代码
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<vector> 6 using namespace std; 7 const int maxn=700; 8 int n, inn[maxn], cnt=0; 9 int s[maxn], G[maxn][maxn]; 10 inline int judge(char x){ 11 if(x<='z'&&x>='a') return x-'a'+27; 12 else return x-'A'+1; 13 } 14 inline char print(int x){ 15 if(x<=26) return 'A'+x-1; 16 return 'a'+x-27; 17 } 18 inline void Addedge(int u,int v){ 19 ++inn[u]; ++inn[v]; 20 G[u][v]=G[v][u]=1; 21 } 22 void Eular(int x){ 23 for(int i=1;i<=52;i++) 24 if(G[x][i]){ 25 G[x][i]=G[i][x]=0; 26 Eular(i); 27 } 28 s[++cnt]=x; 29 } 30 int main(){ 31 cin>>n; 32 char a,b,ss[5]; 33 for(int i=1;i<=n;i++){ 34 scanf("%s",ss); 35 Addedge(judge(ss[0]),judge(ss[1])); 36 } 37 int p=2e9; 38 for(int i=1;i<=52;i++){ 39 if(inn[i]&1){ 40 p=min(p,i); ++cnt; 41 } 42 } 43 if(cnt!=0 && cnt!=2){ 44 printf("No Solution\n"); return 0; 45 } 46 if(cnt==0) 47 for(int i=1;i<=52;i++) if(inn[i]){ 48 p=i; break; 49 } 50 cnt=0; 51 Eular(p); 52 for(int i=cnt;i>=1;i--) printf("%c",print(s[i])); 53 return 0; 54 }