Play on words
题目背景:
分析:题意应该比较好理解,重点是怎么实现,我们可以发现,他需要我们求的是一条欧拉路径,并且我们可以发现,其实对于一个单词而言中间的字母是没有用的,只有两头的有用,然后我们的思路就比较清晰了,从每一个单词的首字母向尾字母连边,之后就形成了一个有26个点的有向图,然后我们针对这个图求解是否存在欧拉路径或欧拉回路即可。
Source:
#include
#include
#include
#include
#include
#include
#include
using namespace std; inline void R(int &v) { char c = 0; bool p = true; v = 0; while(!isdigit(c)) { if(c == '-') p = false; c = getchar(); } while(isdigit(c)) { v = (v << 3) + (v << 1) + (c ^ '0'); c = getchar(); } if(!p) v = -v; } char st[100010][2]; int first[150], tot, n; int in[150], out[150], t; bool vis[150]; char s[1100]; struct node { int next; int to; }edge[200010]; inline void create(int x, int y) { tot++, edge[tot].next = first[x], first[x] = tot, edge[tot].to = y; } void read() { R(n); for(int i = 1; i <= n; ++i) { scanf("%s", s); st[i][0] = s[0], st[i][1] = s[strlen(s) - 1]; create(st[i][0], st[i][1]); create(st[i][1], st[i][0]); int a = st[i][0], b = st[i][1]; out[a]++, in[b]++; } } void dfs(int cur) { vis[cur] = true; for(int p = first[cur]; p; p = edge[p].next) if(!vis[edge[p].to]) dfs(edge[p].to); } void work() { for(int i = (int)'a'; i <= (int)'z'; ++i) if(in[i] || out[i]) { dfs(i); break; } for(int i = (int)'a'; i <= (int)'z'; ++i) if(in[i] || out[i]) if(!vis[i]) { cout << "The door cannot be opened." << '\n'; return ; } int flag1 = false, flag2 = false; for(int i = (int)'a'; i <= (int)'z'; ++i) if(in[i] == out[i]) continue; else if(in[i] == out[i] + 1) { if(flag1) { cout << "The door cannot be opened." << '\n'; return ; } else flag1 = true; } else if(out[i] == in[i] + 1) { if(flag2) { cout << "The door cannot be opened." << '\n'; return ; } else flag2 = true; } else { cout << "The door cannot be opened." << '\n'; return ; } if(!flag1 && !flag2) cout << "Ordering is possible." <<'\n'; else if(flag1 && flag2) cout << "Ordering is possible." << '\n'; else cout << "The door cannot be opened." << '\n'; } void clear() { tot = 0; memset(first, 0, sizeof(first)); memset(in, 0, sizeof(in)); memset(out, 0, sizeof(out)); memset(vis, 0 ,sizeof(vis)); } int main() { R(t); while(t--) { read(); work(); clear(); } return 0; }