| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 10056 | Accepted: 3447 | 
Description
Input
Output
Sample Input
3 2 acm ibm 3 acm malform mouse 2 ok ok
Sample Output
The door cannot be opened. Ordering is possible. The door cannot be opened.
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<string>
#include<vector>
using namespace std;
vector<int> e[27];
int tt,n,in[27],out[27],vis[27];
char s[100010];
void dfs(int x)
{
      vis[x]=1;
      for(int i=0;i<e[x].size();i++)
            if(vis[e[x][i]]==0)
                  dfs(e[x][i]);
}
bool ok(int x)
{
      dfs(x);
      for(int i=0;i<26;i++)
            if(vis[i]==0&&e[i].size()!=0)
                  return false;
      return true;
}
int main()
{
      scanf("%d",&tt);
      while(tt--)
      {
            memset(in,0,sizeof(in));
            memset(out,0,sizeof(out));
            memset(vis,0,sizeof(vis));
            int len,a,b;
            scanf("%d",&n);
            for(int i=0;i<27;i++)
                  e[i].clear();
            for(int i=0;i<n;i++)
            {
                  scanf("%s",s);
                  len=strlen(s);
                  a=s[0]-‘a‘,b=s[len-1]-‘a‘;
                  out[a]++,in[b]++;
                  e[a].push_back(b);
                  e[b].push_back(a);
            }
            if(!ok(a))
            {
                  printf("The door cannot be opened.\n");
                  continue;
            }
            bool flag=false;
            int j;
            for(j=0;j<26;j++)
            {
                  if(in[j]!=out[j])
                  {
                        if(in[j]<out[j])
                        {
                              if(in[j]-out[j]==-1&&flag==0)
                              {
                                    flag=1;
                              }
                              else
                              {
                                    break;
                              }
                        }
                  }
            }
            if(j<26)
                  printf("The door cannot be opened.\n");
            else
                  printf("Ordering is possible.\n");
      }
      return 0;
}
注意连通性
原文:http://www.cnblogs.com/a972290869/p/4245524.html