poj 1386 Play on Words

来源:互联网 发布:2017正规淘宝代刷平台 编辑:程序博客网 时间:2024/06/05 05:32

//poj 1386 Play on Words 欧拉回路
/*
注意连通性,为此WA了很多次哎。。。
*/
#include <iostream>
#include <algorithm>
using namespace std;
const int inf = 1<<28;

int n,m;
int in[26],out[26],con[26][26],mark[26];
char input[1010];

void dfs(int v)
{
     mark[v]=1;
     for (int i=0;i<26;i++)
     if (!mark[i] && (con[v][i] || con[i][v]))
     dfs(i);
}
bool connect(int v)
{
     memset(mark,0,sizeof(mark));
     dfs(v);
     for (int i=0;i<26;i++)
     if ( (in[i] || out[i]) && !mark[i])
     return false;
     return true;
}
int main()
{
    int t,l;scanf("%d",&t);
    while (t--)
    {
          scanf("%d",&n);
          memset(in,0,sizeof(in));
          memset(out,0,sizeof(out));
          memset(con,0,sizeof(con));
          for (int i=0;i<n;i++)
          {
              scanf("%s",input);
              l=strlen(input);
              out[input[0]-'a']++;
              in[input[l-1]-'a']++;
              con[input[0]-'a'][input[l-1]-'a']=1;
          }
          //任意找一个有输入的点进行连通性检测
          for (l=0;l<26;l++)
          if (in[l] || out[l]) break;
          if (!connect(l))
          {
             printf("The door cannot be opened./n");
             continue;
          }
          //检测出入度,仅允许出度与入度相差一的点各一个
          int ind=0,outd=0,i;
          for (i=0;i<26;i++)
          {
              if (in[i]-out[i]==1) ind++;
              else if (in[i]-out[i]==-1) outd++;
              if (abs(in[i]-out[i])>1 || ind>1 || outd>1) break;
          }
          if (i>=26) printf("Ordering is possible./n");
          else printf("The door cannot be opened./n");

    }

    system("pause");
    return 0;
}

原创粉丝点击