uva 10129

来源:互联网 发布:titan5知乎 编辑:程序博客网 时间:2024/06/07 05:21
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=26;
bool g[maxn][maxn];                     //邻接矩阵储存
bool vis[maxn],vis0[maxn];
int num[maxn];
int n;
//判断连通
void dfs(int u)
{
    vis[u]=true;
    for(int v=0;v<maxn;v++)
        if(g[u][v]&&!vis[v]) dfs(v);
}
bool judge(int e)                   //e为起点
{
    memset(vis,false,sizeof(vis));
    dfs(e);
    for(int i=0;i<maxn;i++)
        if(vis0[i]!=vis[i]) return false;
    return true;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        memset(g,false,sizeof(g));
        memset(num,0,sizeof(num));
        memset(vis0,false,sizeof(vis0));
        scanf("%d",&n);
        while(n--)
        {
            string s;
            cin>>s;
            int k=s.length();
            int a=s[0]-'a';
            int b=s[k-1]-'a';
            g[a][b]=true;
            vis0[a]=vis0[b]=true;                   //表示出现过的字符
            num[a]--;
            num[b]++;
        }
        bool flag=true,in=false,out=false;                 //判断出入度
        int e;
        for(int i=0;i<maxn;i++)
        {
            if(num[i]<-1||num[i]>1) {
                flag=false;
                break;
            }
            if(num[i]==-1)
            {
                if(in)
                {
                    flag=false;
                    break;
                }
                in=true;
                e=i;
            }
            if(num[i]==1)
            {
                if(out)
                {
                    flag=false;
                    break;
                }
                out=true;
            }
        }
        if(flag) flag=judge(e);                      //判断连通
        if(flag) printf("Ordering is possible.\n");
        else printf("The door cannot be opened.\n");
    }
    return 0;
}

原创粉丝点击