P1341 无序字母对

题面:https://www.luogu.org/problem/P1341

本题是一个欧拉回路模板题,直接建图跑欧拉回路即可,注意:有环时需回溯后再记录.

Code:
#include<iostream>
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=10005;
int cnt[N][N],ans[N],cur,cnt0[N];
void dfs(int u){
    for(int i=1;i<=52;i++){
        if(cnt[u][i]){
            cnt[u][i]--;
            cnt[i][u]--;
            cnt0[i]--;
            cnt0[u]--;
            dfs(i);
        }
    }
	ans[++cur]=u;
}
int main(){
    int n,kdl=0;
    scanf("%d",&n);
    scanf("\n");
    for(int i=1;i<=n;i++){
        char a,b;
        int c,d;
        scanf("%c%c\n\n",&a,&b);
        if(a>='A'&&a<='Z')c=a-'A'+1;
        else c=a-'a'+27;
        if(b>='A'&&b<='Z')d=b-'A'+1;
        else d=b-'a'+27;
        cnt[c][d]++;cnt[d][c]++;
        cnt0[c]++,cnt0[d]++;
    }
    int f=0;
    for(int i=1;i<=52;i++){
        if(cnt0[i]&1){
            if(f==0){
				f=i;
			}
            kdl++;
        }
	}
    if(kdl!=2&&kdl){
        puts("No Solution");
        return 0;
    }
    if(kdl==0){
        for(int i=1;i<=52;i++){
            if(cnt0[i]){
                f=i;
                break;
            }
        }
    }
    dfs(f);
    for(int i=1;i<=52;i++){
        if(cnt0[i]){
            puts("No Solution");
            return 0;
        }
    }
    for(int i=cur;i>=1;i--){
        if(ans[i]>=1&&ans[i]<=26){
			printf("%c",ans[i]+'A'-1);
		}
        else{
			printf("%c",ans[i]+'a'-27);
		}
    }
    puts("");
    return 0;
}
posted @ 2019-09-11 00:22  prestige  阅读(165)  评论(0编辑  收藏  举报