poj.org/problem?id=2337
这是一个有向图的欧拉路径问题 不忍吐槽 搞了好久。
#include <vector>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 30;
struct node{
int v;
bool vis;
string word;
node(){
vis = false;
v = -1;
}
bool operator < (const node &A) const{
return word < A.word;
}
};
vector <node> vt[N];
string s;
int father[N],O[N],I[N];
int top;
string path[1010];
void Init(){
top = 0;
for(int i=0; i<26; i++){
father[i] = i;
vt[i].clear();
O[i] = I[i] = 0;
}
}
int Find(int x){
if(x != father[x])
father[x] = Find(father[x]);
return father[x];
}
void DFS(int u){
for(int i=0; i<vt[u].size(); i++){
if(!vt[u][i].vis){
vt[u][i].vis = 1;
DFS(vt[u][i].v);
path[top++] = vt[u][i].word;
}
}
}
int main(){
int cas;
scanf("%d",&cas);
while(cas--){
Init();
int n;
scanf("%d",&n);
while(n--){
cin >> s;
int l = s.size();
int u = s[0]-'a', v = s[l-1]-'a';
node e;
O[u]++,I[v]++;
father[Find(u)] = Find(v);
e.v = v,e.word = s;
vt[u].push_back(e);
}
int tmp = 0;
for(int i=0; i<26; i++)
if(O[i] + I[i])
if(father[i] == i) tmp++;
if(tmp > 1){
puts("***");
continue;
}
int cnt1 = 0, cnt2 = 0, cnt3 = 0,home = -1;
for(int i=0; i<26; i++){
if(O[i] == I[i]) continue;
if(O[i] - I[i] == 1) cnt1++, home = i;
else if(I[i] - O[i] == 1) cnt2++;
else cnt3++;
}
if(cnt3) {
puts("***");
continue;
}
for(int i=0; i<26; i++)
if(vt[i].size()) sort(vt[i].begin(),vt[i].end());
bool flag = true;
if(!cnt1 && !cnt2){
for(int i=0; i<26; i++){
if(O[i]+I[i]){
DFS(i);
break;
}
}
}
else if(cnt1 == 1 && cnt2 == 1) DFS(home);
else{
puts("***");
flag = false;
continue;
}
if(!flag) continue;
for(int i=top-1; i>0; i--)
cout << path[i] << ".";
cout << path[0] << endl;
}
return 0;
}