hdu 1116 Play on Words 并查集+欧拉通路

本题的题意就是拼接单词,只要单词的首个字母与另一个单词的末字母相同他们就能拼接在一起;

最后若能把所有的单词拼接在一起(可以形成一个圈)就可以了;

所以首先这些首末字母得连通,其次若形成了一个欧拉通路即形成了一个环,则所有初度和入度都相等;

如果形成了一条链,则链的第一个和最后一个字母的入度和初度的值差一,链中间字母的入度和初度都相等;

 

#include"stdio.h"
#include"string.h"
#include"math.h"
int in[1000],out[1000];
int mark[1000],pre[1000];
int p[100];
char str[1000];
int find(int k)
{
 if(k!=pre[k])
  pre[k]=find(pre[k]);
 return pre[k];
}
int main()
{
 int i,k,h,xx,yy;
 scanf("%d",&k);
 while(k--)
 {
  scanf("%d",&h);
  for(i=0;i<26;i++)
   pre[i]=i;
  memset(in,0,sizeof(in));
  memset(out,0,sizeof(out));
  memset(mark,0,sizeof(mark));
  for(i=0;i<h;i++)
  {
   scanf("%s",str);
   xx=str[0]-'a';
   yy=str[strlen(str)-1]-'a';
   mark[xx]++;mark[yy]++;
   in[xx]++;out[yy]++;
   int aa,bb;
   aa=find(xx);bb=find(yy);
   if(aa!=bb)
    pre[bb]=aa;
  }
  int sum=0,t=0;
  for(i=0;i<26;i++)
  {
   if(mark[i]!=0)
   {
      if(pre[i]==i)
       sum++;
      if(in[i]!=out[i])
      {
       p[t]=i;
       t++;
      }
   }
  }
  if(sum!=1)
   printf("The door cannot be opened.\n");
  else if(t==0)
   printf("Ordering is possible.\n");
  else if(t==2&&abs(in[p[0]]-out[p[0]])==1&&abs(in[p[1]]-out[p[1]])==1)
      printf("Ordering is possible.\n");
  else
            printf("The door cannot be opened.\n");
 }
 return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值