poj 2337
欧拉路径。
代码:
#include<iostream>
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;
int n;
char x[1001][22];
struct e{
int data;
int num;
int vis;
};
int in[30],out[30],v[30];
vector<e> edge[30],edge1[30];
int cmp1(const void *a,const void*b){
char *s1=(char *)a;
char *s2=(char *)b;
return strcmp(s1,s2);
}
void dfs(int s){
int i,j,k;
v[s]=1;
for(i=0;i<edge1[s].size();i++)
if(v[edge1[s][i].data]==0)
dfs(edge1[s][i].data);
}
int judge(){
int i,j,f=0;
memset(v,0,sizeof(v));
dfs(x[0][0]-'a');
for(i=0;i<26;i++)
if(v[i]==0&&in[i]!=0)
return -1;
j=-1;
for(i=0;i<26;i++)
if(in[i]!=out[i])
{
if(in[i]<out[i])
{
if(in[i]-out[i]==-1&&f==0)
{
f=1;j=i;
}
else
break;
}
}
if(i<26) return -1;
if(j!=-1) return j;
else
for(i=0;i<26;i++)
if(out[i]!=0)
return i;
}
int ans[1001],top;
void solve(int s){
int i;
for(i=0;i<edge[s].size();i++)
{
if(edge[s][i].vis==0)
{
edge[s][i].vis=1;
solve(edge[s][i].data);
ans[top++]=edge[s][i].num;
}
}
}
void read(){
// ifstream cin("in.txt");
int i,j,k,s,t;
cin>>k;
while(k--)
{
cin>>n;
memset(in,0,sizeof(in));
memset(out,0,sizeof(out));
for(i=0;i<26;i++)
{
edge[i].clear();
edge1[i].clear();
}
for(i=0;i<n;i++)
cin>>x[i];
qsort(x,n,sizeof(char)*22,cmp1);
for(i=0;i<n;i++)
{
s=x[i][0]-'a';
t=x[i][strlen(x[i])-1]-'a';
out[s]++;
in[t]++;
e b;
b.num=i;
b.data=t;
b.vis=0;
edge[s].push_back(b);
edge1[s].push_back(b);
b.data=s;
edge1[t].push_back(b);
}
s=judge();
if(s==-1)
{
cout<<"***"<<endl;
continue;
}
top=1;
solve(s);
for(i=n;i>=2;i--)
cout<<x[ans[i]]<<'.';
cout<<x[ans[1]]<<endl;
}
}
int main(){
read();
return 0;
}
浙公网安备 33010602011771号