解题思路:
我好菜啊!!
首先可以n2搞定,而对于每个点,又可以在当前不优的状态下将不好的状态拼到后面。
最后回溯搞定。
代码:
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 int n; 5 bool r[1000][1000]; 6 int ind[1000]; 7 int ans[1000]; 8 char cmd[10]; 9 int cnt; 10 int tot; 11 void dfs(int x) 12 { 13 14 for(int i='A';i<='z';i++) 15 if(r[x][i]) 16 { 17 r[x][i]=r[i][x]=false; 18 dfs(i); 19 } 20 ans[++tot]=x; 21 } 22 int main() 23 { 24 scanf("%d",&n); 25 for(int i=1;i<=n;i++) 26 { 27 scanf("%s",cmd+1); 28 r[cmd[1]][cmd[2]]=r[cmd[2]][cmd[1]]=true; 29 ind[cmd[1]]++; 30 ind[cmd[2]]++; 31 } 32 for(int i='A';i<='z';i++) 33 if(ind[i]&1) 34 cnt++; 35 if(cnt!=0&&cnt!=2) 36 { 37 puts("No Solution"); 38 return 0; 39 } 40 int sta; 41 for(int i='z';i>='A';i--) 42 if(ind[i]) 43 { 44 if(cnt) 45 { 46 if(ind[i]&1) 47 sta=i; 48 }else 49 sta=i; 50 } 51 dfs(sta); 52 if(tot!=n+1) 53 { 54 puts("No Solution"); 55 return 0; 56 } 57 for(int i=tot;i;i--) 58 printf("%c",ans[i]); 59 puts(""); 60 return 0; 61 }