【洛谷】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 }

 

posted @ 2018-08-09 10:31  noble_(noblex)  阅读(185)  评论(0编辑  收藏  举报
/* */