AC代码
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
struct node{
char str[30];
int u;
int v;
};
vector<node>maps[30];
int in[30];
int out[30];
int via[30][30];
int father[30];
int n;
int vis[30][30];
vector<node>path;
int find(int a)
{
while(a!=father[a])
a=father[a];
return a;
}
void merge(int a,int b)
{
a=find(a);
b=find(b);
if(a!=b)
father[a]=b;
}
bool judge(int &r)
{
int a,b;
a=b=0;
for(int i=1;i<30;++i)
{
if(in[i]==out[i]+1)
a++;
else if(out[i]==in[i]+1)
{
b++;
r=i;
}
else if((in[i]-out[i]>1)||(out[i]-in[i]>1))
return false;
}
if(a>1||b>1||a+b==1)
return false;
if(a+b==0)
{
for(int i=1;i<30;++i)
if(in[i]+out[i])
{
r=i;
break;
}
}
int c=0;
for(int i=1;i<30;++i)
{
father[i]=i;
if(in[i]+out[i])
c++;
}
for(int i=1;i<30;++i)
{
for(int j=1;j<30;++j)
{
if(vis[i][j])
{
if(find(i)!=find(j))
{
merge(i,j);
c--;
}
}
}
}
return c==1;
}
void euler(int r)
{
for(int i=0;i<maps[r].size();++i)
{
int e=maps[r][i].v;
if(vis[r][e])
{
vis[r][e]--;
euler(e);
path.push_back(maps[r][i]);
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
path.clear();
memset(in,0,sizeof(in));
memset(out,0,sizeof(out));
memset(vis,0,sizeof(vis));
for(int i=0;i<30;++i)
maps[i].clear();
scanf("%d",&n);
for(int i=0;i<n;++i)
{
char cha[30];
scanf("%s",cha);
int s=cha[0]-'a'+1;
int e=cha[strlen(cha)-1]-'a'+1;
node temp;
temp.u=s;
temp.v=e;
strcpy(temp.str,cha);
maps[s].push_back(temp);
in[e]++;
out[s]++;
vis[s][e]++;
}
int r=0;
if(judge(r)==false)
printf("***\n");
else
{
euler(r);
for(int i=path.size()-1;i>=0;--i)
{
printf("%s", path[i].str);
if(i!=0)
printf(".");
else
printf("\n");
}
}
}
return 0;
}