rt,使用邻接表存图,已用并查集判连通。
#include <iostream>
#include <vector>
#include <stack>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 5000;
vector<char> G[N];
int n, allmax, allmin = 1e5;
int deg[N], start, cnt = 0;
stack<char> ans;
bool vis[N][N];
char f[N];
char find(char x) {
if(f[x] == x) return x;
char t = find(f[x]);
f[x] = t;
return f[x];
}
void dfs(int now) {
for(int i = 0; i < G[now].size(); i++) {
if(!vis[now][G[now][i]] && !vis[G[now][i]][now]) {
vis[now][G[now][i]] = 1;
vis[G[now][i]][now] = 1;
dfs(G[now][i]);
}
}
ans.push(now);
}
int main() {
for(int i = 64; i <= 125; i++) f[i] = i;
scanf("%d", &n);
for(int i = 1; i <= n; i++) {
char u, v;
char s[2];
scanf("%s", &s);
u = s[0];
v = s[1];
G[u].push_back(v);
G[v].push_back(u);
deg[u]++;
deg[v]++;
char xx = find(u), yy = find(v);
f[xx] = yy;
}
for(int i = 64; i <= 125; i++) {
if(f[i] == i && deg[i]) cnt++;
}
if(cnt != 1) {
printf("No Solution\n");
return 0;
}
cnt = 0;
bool flag = false;
for(int i = 64; i <= 125; i++) sort(G[i].begin(), G[i].end());
for(int i = 64; i <= 125; i++) {
if(deg[i] % 2 == 1) {
if(!flag) start = i;
cnt++;
}
}
if(cnt > 0 && cnt != 2) {
printf("No Solution\n");
return 0;
}
if(!flag) {
for(int i = 64; i <= 125; i++) {
if(deg[i]) {
start = i;
break;
}
}
}
dfs(start);
while(!ans.empty()) {
char t = ans.top();
printf("%c", t);
ans.pop();
}
return 0;
}