您的位置:首页 > 其它

Play on Words

2015-06-06 17:54 393 查看
http://poj.org/problem?id=1386
#include<iostream>

#include<string>

#include<cmath>

using namespace std;

char ch[1010];

int vis[30],indot[30],outdot[30],f[30];

int find(int x)

{

 if(f[x]==x)

  return x;

 else

 {

  f[x]=find(f[x]);

  return f[x];

 }

}

void merge(int u,int v)

{

 int k1=find(u);

 int k2=find(v);

 if(k1!=k2)

  f[k2]=k1;

}

bool judge()

{

 int i,sum1,sum2,sum3;

 sum1=sum2=sum3=0;

 for(i=0;i<26;i++)

 {

  if(f[i]==i && vis[i])

   sum1++;

  if(abs(indot[i]-outdot[i])==1)

   sum2++;

  else if(indot[i]!=outdot[i])

   sum3++;

 }

 if(sum1==1)

  if((sum2==2 || sum2==0 ) && sum3==0)

   return 1;

 return 0;

}

int main()

{

// freopen("C:\\Users\\John\\Desktop\\hi.txt","r",stdin);

 int t,i;

 cin>>t;

 while(t--)

 {

  memset(vis,0,sizeof(vis));

  memset(indot,0,sizeof(indot));

  memset(outdot,0,sizeof(outdot));

  for(i=0;i<26;i++)

   f[i]=i;

  int n;

  cin>>n;

  while(n--)

  {

   cin>>ch;

   vis[ch[0]-'a']=1;

   int k=strlen(ch)-1;

   vis[ch[k]-'a']=1;

   outdot[ch[0]-'a']++;

   indot[ch[k]-'a']++;

   merge(ch[0]-'a',ch[k]-'a');

  }

  if(judge())

   cout<<"Ordering is possible."<<endl;

  else

   cout<<"The door cannot be opened."<<endl;

 }

 return 0;

}

////////////////////////////////////////////////////////////////////////////////////////////

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#define VM 30

int indeg[VM],outdeg[VM],mat[VM][VM],start;

bool vis[VM];

void dfs (int u)

{

    for (int i = 0; i < 26; i ++)

        if (mat[u][i])

        {

            mat[u][i] = 0;

            dfs(i);

        }

}

bool cmp()

{

    int i,k,sum1,sum2,sum3;

    sum1 = sum2 = sum3 = 0;

    for (i = 0; i < 26; i ++)

    {

        if (indeg[i] - outdeg[i] == 1)

            sum1 ++;

        if (outdeg[i] - indeg[i] == 1)

        {

            sum2 ++;

            start = i;

        }

        if (indeg[i] == outdeg[i]&&indeg[i]!= 0)

            k = i;

        if (abs(indeg[i] - outdeg[i]) > 1)

            sum3 ++;

    }

    if (sum1 > 1||sum2 > 1||sum3 > 0)

        return false;

    if (sum2 == 0)

        start = k;

    return true;

}

int main ()

{

    int T,n;

    bool flag;

    char str[1005];

    scanf ("%d",&T);

    while (T --)

    {

        scanf ("%d",&n);

        memset (indeg,0,sizeof(indeg));

        memset (outdeg,0,sizeof(outdeg));

        memset (mat,0,sizeof(mat));

        memset (vis,false,sizeof(vis));

        while (n --)

        {

            scanf ("%s",str);

            int len = strlen(str);

            int u = str[0]-'a';

            int v = str[len-1]-'a';

            mat[u][v] = 1;

            indeg[v] ++;

            outdeg[u] ++;

        }

        flag = false;

        if (cmp ())

        {

            flag = true;

            dfs(start);

            for (int i = 0; i < 26; i ++)

                for (int j = 0; j < 26; j ++)

                    if (mat[i][j])

                    {

                        flag = false;

                        break;

                    }

        }

        if (flag)

            printf ("Ordering is possible.\n");

        else

            printf ("The door cannot be opened.\n");

    }

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: