test
来源:互联网 发布:telnet端口23在哪 编辑:程序博客网 时间:2024/05/21 05:44
#include <iostream>using namespace std;int degree_in[26],degree_out[26],edge_num,edge_order[1005];bool used[1005];struct Edge{ int start,end; char word[25];}edges[1005];int CMP(const void* a,const void* b){ Edge *c=(Edge*)a,*d=(Edge*)b; if(c->start!=d->start) return c->start-d->start; else return strcmp(c->word,d->word);}inline int ABS(int a){ if(a>0) return a; else return -a;}int check()//返回起点{ int cnt1=0,cnt2=0,source; for(int i=0;i<26;i++) { if(ABS(degree_in[i]-degree_out[i])==2) return -1; else if(degree_in[i]-degree_out[i]==1) cnt1++; else if(degree_in[i]-degree_out[i]==-1) { cnt2++; source=i; } } if(cnt1>1||cnt2>1) return -1; else if(cnt1==0) { for(int i=0;i<26;i++) if(degree_out[i]) return i; } else return source;}bool solve_dfs(int source,int cnt){ if(cnt==edge_num) return true; for(int i=0;i<edge_num;i++) { if(edges[i].start<source||used[i]) continue; else if(edges[i].start>source) return false; used[i]=true; edge_order[cnt]=i; if(solve_dfs(edges[i].end,cnt+1)) return true; used[i]=false; } return false;}int main(){ int t; scanf("%d",&t); while(t--) { memset(degree_out,0,sizeof(degree_out)); memset(degree_in,0,sizeof(degree_in)); scanf("%d",&edge_num); for(int i=0;i<edge_num;i++) { scanf("%s",edges[i].word); edges[i].start=edges[i].word[0]-'a'; edges[i].end=edges[i].word[strlen(edges[i].word)-1]-'a'; degree_out[edges[i].start]++; degree_in[edges[i].end]++; } int source=check(); if(source==-1) { printf("***/n"); continue; } qsort(edges,edge_num,sizeof(edges[0]),CMP); memset(used,0,sizeof(used)); if(!solve_dfs(source,0)) { printf("***/n"); continue; } printf("%s",edges[edge_order[0]].word); for(int i=1;i<edge_num;i++) { printf(".%s",edges[edge_order[i]].word); } printf("/n"); }}