uva 10441 尤拉路
阿新 • • 發佈:2018-11-17
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; }