洛谷P1341 无序字母对[无向图欧拉路]

题目描述

给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒)。请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现。

输入输出格式

输入格式:

第一行输入一个正整数n。

以下n行每行两个字母,表示这两个字母需要相邻。

输出格式:

输出满足要求的字符串。

如果没有满足要求的字符串,请输出“No Solution”。

如果有多种方案,请输出前面的字母的ASCII编码尽可能小的(字典序最小)的方案

输入输出样例

输入样例#1:
4
aZ
tZ
Xt
aX
输出样例#1:
XaZtX
 

说明

【数据规模与约定】

不同的无序字母对个数有限,n的规模可以通过计算得到。


看似很水,实际暴露了很多问题

1.无向图欧拉路,de全为even或两个odd

2.欧拉路是vis判边走过没有不是点

3.字典序 加一个栈里逆序输出,这个栈要n*n大小

4.大小写字母虽然中间夹了几个字符,也没必要写个ID函数

5.%别打成/

//
// main.cpp
// luogu1341
//
// Created by Candy on 11/11/2016.
// Copyright © 2016 Candy. All rights reserved.
//
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=,INF=1e9;
int n,cn=,a[N],u,v;
char s[];
//inline int id(char c){if(c>='a') return c-'a'+26;else return c-'A';}
//void print(int x){if(x<26) putchar(x+'A');else putchar(x-26+'a');}
int de[N],g[N][N];
int vis[N][N],st[N*N],top=;
void dfs(int u){
for(int i=;i<cn;i++) if(g[u][i]&&!vis[u][i])
vis[u][i]=vis[i][u]=,dfs(i);
st[++top]=u;
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%s",s);
//u=id(s[0]);v=id(s[1]);//printf("edge %d %d\n",u,v);
u=s[]-'A';v=s[]-'A';
de[u]++;de[v]++;g[u][v]=g[v][u]=;
}
int cnt=,s1=cn,s2=cn;
for(int i=;i<=cn;i++) if(de[i]){
s1=min(i,s1);
if(de[i]%) cnt++,s2=min(i,s2);
} if(cnt==) dfs(s1);
else if(cnt==) dfs(s2);
else {puts("No Solution");return ;}
while(top) putchar(st[top--]+'A');
}
上一篇:MyBatis的动态SQL详解-各种标签使用


下一篇:C++重写与重载、重定义