• 【洛谷】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
    "); 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 }
  • 相关阅读:
    HDU 6430 Problem E. TeaTree(虚树)
    hdu6437 Problem L.Videos(网络流)
    Rikka with Prefix Sum(组合数学)
    借教室
    2018年全国多校算法寒假训练营练习比赛(第五场)H Tree Recovery
    1296 营业额统计
    FZU oj Problem 2082 过路费
    大数乘法(适合k进制)
    重载小于号
    莫比乌斯
  • 原文地址:https://www.cnblogs.com/noblex/p/9447397.html
Copyright © 2020-2023  润新知