Play on Words UVA 10129 (有向图的欧拉路)

说说:

这道题的题意很简单,就是给你一些单词,问是否能形成一个句子,使前一个单词的最后一个字母等于后一个单词的第一个字母。本质上来说就是有向图的欧拉路问题,当然存在欧拉回路也是OK的。一开始的时候,我以为存在欧拉路只需判断两种情况:一,是存在欧拉回路,即每个节点的入度等于出度。二,存在欧拉路,有且仅有一个节点的入度比出度大一,一个节点的出度比入度大一。只要满足任意其中一种情况即可。事实上不是这样的,其实还需要判断该图是否连通。这自然而然就想到了并查集的思想。当出现两个节点的时候,将其中的一个节点指向另一个节点的根,最后判断所有节点的根是否相同。若相同,则是连通图。(其实可以证明,第二种情况肯定是连通的)

源代码:

#include <stdio.h>
#include <string.h>
#define MAX 1000+5

int fa[26];

int find(int i){//并查集
  if(fa[i]!=i)
    return fa[i]=find(fa[i]);
  else
    return fa[i];
}

int main(){
  int T,M,i,len,Fa;
  char word[MAX];
  int in[26];//入度
  int out[26];//出度
  int vis[26];
  int YES,inone,outone;
  //freopen("data","r",stdin);
  scanf("%d",&T);
  while(T--){
   YES=1;
   inone=outone=0;
   memset(in,0,sizeof(in));
   memset(out,0,sizeof(out));
   memset(vis,0,sizeof(vis));
   for(i=0;i<26;i++)
    fa[i]=i;
   scanf("%d",&M);

   for(i=0;i<M;i++){
    scanf("%s",word);
    len=strlen(word);
    out[word[0]-'a']++;
    in[word[len-1]-'a']++;
    vis[word[0]-'a']=vis[word[len-1]-'a']=1;
    fa[word[0]-'a']=Fa=find(word[len-1]-'a');
   }

   for(i=0;i<26;i++)
     if(vis[i]&&find(i)!=Fa)
       YES=0;

  if(YES)
   for(i=0;i<26;i++)
    if(in[i]!=out[i]){
      if(in[i]==out[i]+1)
       inone++;//入度比出度大一的节点数
      else if(out[i]==in[i]+1)
       outone++;//出度比入度大一的节点数
      else{
       YES=0;
       break;
      }
   }

  if(YES&&inone==outone&&(inone==1||inone==0))
   printf("Ordering is possible.\n");
  else
   printf("The door cannot be opened.\n");

  }

 return 0;
}
时间: 2024-10-15 20:53:23

Play on Words UVA 10129 (有向图的欧拉路)的相关文章

Play on Words,UVA 10129——求欧拉回路/欧拉通路

Play on words 紫书上的一道题: 输入n(n<=100000)个单词,是否可以把所有这些单词排成一个序列,使得每个单词的第一个字母和上一个单词的最后一个字母相同.每个单词最多包含1000个小写字母.输入中可以有重复单词. 分析: 把字母看成结点,单词看成有向边,则问题有解,当且仅当图中存在欧拉通路/欧拉回路 欧拉通路/回路:通过图中所有边一次且仅一次行遍所有顶点的通路/回路 有向图存在欧拉回路的判断条件:当且仅当有向图是强连通的,且没有奇度顶点,所有顶点的入度等于出度 有向图存在欧拉

ZOJ2016 POJ1386(有向图的欧拉路判断)

Play on Words Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9710   Accepted: 3352 Description Some of the secret doors contain a very interesting word puzzle. The team of archaeologists has to solve it to open that doors. Because there

UVA 10441 Catenyms【欧拉路】

题目链接:http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=41674 题意:给定一些单词,如果一个单词的尾字母与另一个的首字母相同则可以连接.问是否可以每个单词用一次,将所有单词连接,可以则输出字典序最小的序列. 代码: #include <stdio.h> #include <ctime> #include <math.h> #include <limits.h> #includ

POJ1386Play on Words[有向图欧拉路]

Play on Words Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 11846   Accepted: 4050 Description Some of the secret doors contain a very interesting word puzzle. The team of archaeologists has to solve it to open that doors. Because ther

NYOJ 99单词拼接(有向图的欧拉(回)路)

1 /* 2 NYOJ 99单词拼接: 3 思路:欧拉回路或者欧拉路的搜索! 4 注意:是有向图的!不要当成无向图,否则在在搜索之前的判断中因为判断有无导致不必要的搜索,以致TLE! 5 有向图的欧拉路:abs(In[i] - Out[i])==1(入度[i] - 出度[i])的节点个数为两个 6 有向图的欧拉回路:所有的节点都有In[i]==Out[i] 7 */ 8 #include<iostream> 9 #include<cstring> 10 #include<cs

POJ 2337 &amp;&amp; ZOJ 1919--Catenyms 【有向图 &amp;&amp; 欧拉路判断 &amp;&amp; 欧拉路径】

Catenyms Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10427   Accepted: 2726 Description A catenym is a pair of words separated by a period such that the last letter of the first word is the same as the last letter of the second. For

图论--欧拉路,欧拉回路(小结)

在题目中在慢慢细说概念 1.HDU - 3018 Ant Trip 题目大意:又N个村庄,M条道路,问需要走几次才能将所有的路遍历 解题思路:这题问的是有关欧拉路的判定 欧拉路就是每条边只能走一次,且要遍历所有的边,简单的说就是一笔画(图连通) 这道题是无向图的欧拉路,无向图的欧拉路的判定:所有点的度数都是偶数度,或者只有两个点的度是奇数度,且图要是连通图 知道欧拉路是什么后,这题就比较好做了,第一件事就是找到有几个连通块,然后再判断一下每个连通块需要几笔才能完成就好了 #include <cs

hiho 1182 : 欧拉路&amp;#183;三

1182 : 欧拉路·三 这时题目中给的提示: 小Ho:是这种.每次转动一个区域不是相当于原来数字去掉最左边一位,并在最后加上1或者0么. 于是我考虑对于"XYYY",它转动之后能够变成"YYY0"或者"YYY1".我就将全部的数字0~2^N-1看作2^N个点.连接全部的("XYYY","YYY0"),("XYYY","YYY1"). 比方当N=3时,我得到了这样一个

hiho 1182 : 欧拉路&#183;三

1182 : 欧拉路·三 这时题目中给的提示: 小Ho:是这样的,每次转动一个区域不是相当于原来数字去掉最左边一位,并在最后加上1或者0么. 于是我考虑对于"XYYY",它转动之后可以变成"YYY0"或者"YYY1".我就将所有的数字0~2^N-1看作2^N个点,连接所有的("XYYY","YYY0"),("XYYY","YYY1"). 比如当N=3时,我得到了这样一