//Accepted 248 KB 125 ms //欧拉回路 //以26个字母为定点,一个单词为从首字母到末尾字母的一条边 //下面就是有向图判断欧拉回路 //连通+节点入度和==出度和 或者 存在一对节点一个入度比出度大1,一个小1 #include <cstdio> #include <cstring> #include <iostream> #include <queue> using namespace std; ; int a[imax_n][imax_n]; bool used[imax_n]; bool vis[imax_n]; int cnt_in[imax_n],cnt_out[imax_n]; int n; ]; queue<int >q; void bfs(int s) { while (!q.empty()) q.pop(); //if (used[s]==0) return 0; q.push(s); vis[s]=; while (!q.empty()) { int x=q.front(); q.pop(); ;i<imax_n;i++) { && !vis[i] && a[x][i]) { vis[i]=; q.push(i); } } } } bool judge() { int flag; ;i<=;i++) { memset(vis,,sizeof(vis)); bfs(i); flag=; ;j<=;j++) && !vis[j]) flag=; ) ; } ; } bool slove() { int p,ne; p=ne=; ;i<=;i++) { int t=cnt_in[i]-cnt_out[i]; ) continue; ) { p++; ) ; continue; } ) { ne++; ) ; continue; } ; } && ne== || p== && ne==)) ; ; } int main() { int T; scanf("%d",&T); while (T--) { scanf("%d",&n); int x,y; memset(a,,sizeof(a)); memset(used,,sizeof(used)); memset(cnt_in,,sizeof(cnt_in)); memset(cnt_out,,sizeof(cnt_out)); ;i<n;i++) { scanf("%s",s); int l=strlen(s); x=s[]-; y=s[l-]-; used[s[]-]=true; used[s[l-]-]=true; a[x][y]=; cnt_out[x]++; cnt_in[y]++; } && slove()==) printf("Ordering is possible.\n"); else printf("The door cannot be opened.\n"); } ; }