luogu_1341 无序字母对

Posted Code_Together

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了luogu_1341 无序字母对相关的知识,希望对你有一定的参考价值。

#include <cstring>
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
int n,ans[100010],cnt,in[60];
vector<int> G[60];
bool vis[60],answer,dis[60][60],oula;
char word[]={‘A‘,‘B‘,‘C‘,‘D‘,‘E‘,‘F‘,‘G‘,‘H‘,‘I‘,‘J‘,‘K‘,‘L‘,‘M‘,‘N‘,‘O‘,‘P‘,‘Q‘,‘R‘,‘S‘,‘T‘,‘U‘,‘V‘,‘W‘,‘X‘,‘Y‘,‘Z‘,
‘a‘,‘b‘,‘c‘,‘d‘,‘e‘,‘f‘,‘g‘,‘h‘,‘i‘,‘j‘,‘k‘,‘l‘,‘m‘,‘n‘,‘o‘,‘p‘,‘q‘,‘r‘,‘s‘,‘t‘,‘u‘,‘v‘,‘w‘,‘x‘,‘y‘,‘z‘};

char getc(){
    char c;
    c=getchar();
    while(1){
        if(‘a‘<=c && c<=‘z‘ || (‘A‘<=c && c<=‘Z‘))return c;
        c=getchar();
    }
}

void make(){
    for(int i=1;i<=n;i++){
        char u,v;
        int u1,v1;
        u=getc(); v=getc();
        if(‘A‘<=u && u<=‘Z‘)u1=u-‘A‘;
        else u1=u-‘a‘+26;
        if(‘A‘<=v && v<=‘Z‘)v1=v-‘A‘;
        else v1=v-‘a‘+26;
        in[u1]++; in[v1]++;
		vis[u1]=vis[v1]=1;
        G[u1].push_back(v1); G[v1].push_back(u1);
    }
}

bool check(){
	int sum=0;
	for(int i=0;i<52;i++)if(in[i]%2==1)sum++;
	if(sum!=2 && sum)return false;
	return true;
}

void dfs(int u){
	ans[++cnt]=u;
	for(int i=0;i<G[u].size();i++){
		int v=G[u][i];
		if(cnt==n+1)return;
		if(!dis[u][v]){
			dis[u][v]=1; dis[v][u]=1;
			dfs(v);
			dis[u][v]=0; dis[v][u]=1;
		}
	}
	if(cnt!=n+1)cnt--;
}

int main(){
    scanf("%d",&n);  
    make();
	if(!check()){puts("No Solution"); return 0;}
	for(int i=0;i<52;i++)sort(G[i].begin(),G[i].end());
	int start=0;
    for(int i=0;i<52;i++)
		if(vis[i]){start=i; break;}
    for(int i=0;i<52;i++)
    	if(in[i]%2==1){start=i; break;}
	dfs(start);
	for(int i=1;i<=cnt;i++)putchar(word[ans[i]]);
	puts("");
    return 0;
}

  

以上是关于luogu_1341 无序字母对的主要内容,如果未能解决你的问题,请参考以下文章

[luogu1341] 无序字母对

[luogu1341][无序字母对]

Luogu 1341 无序字母对 - 欧拉路径

[Luogu1341]无序字母对(欧拉回路)

P1341 无序字母对(Hierholzer算法判断欧拉回路)

P1341 无序字母对(欧拉回路)