POJ 1386 单词接龙问题

题目大意:

给一堆字母,让它们进行接龙,要头对尾能够接的上,问有没有一种方法让所有成语都完成接龙

这道题实际上是在考虑是否存在一条欧拉通路,每个单词产生一条有向线段,由第一个字母指向最后一个字母

这道题另一个需要考虑的是是否所有存在的字母都是处于一个连通分量中的,这里我们考虑用并查集来解决问题。

代码如下:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5 int fa[30],in[30],out[30],visit[30];
 6 char str[1005];
 7 int find_head(int x)
 8 {
 9     int u=x;
10     while(x!=fa[x]){
11         x=fa[x];
12     }
13     fa[u]=x;
14     return x;
15 }
16 int Union(int x,int y)
17 {
18     int fa_x=find_head(x);
19     int fa_y=find_head(y);
20     if(fa_x!=fa_y){
21         fa[fa_x]=fa_y;
22     }
23     return fa_y;
24 }
25 int main()
26 {
27     int T,n,tmp;
28     scanf("%d",&T);
29     while(T--){
30         scanf("%d",&n);
31         memset(in,0,sizeof(in));
32         memset(out,0,sizeof(out));
33         memset(visit,0,sizeof(visit));
34         for(int i=1;i<=26;i++) fa[i]=i;
35         for(int i=0;i<n;i++){
36             scanf("%s",str);
37             int len=strlen(str);
38             out[str[0]-‘a‘+1]++;
39             in[str[len-1]-‘a‘+1]++;
40             tmp=Union(str[0]-‘a‘+1,str[len-1]-‘a‘+1);//记录那个唯一的头结点
41             //cout<<tmp<<endl;
42             visit[str[0]-‘a‘+1]=1;
43             visit[str[len-1]-‘a‘+1]=1;
44         }
45         bool flag=true;
46         for(int i=1;i<=26;i++){
47             if(visit[i]){
48                 if(find_head(i)!=tmp){flag=false;break;}
49             }
50         }
51         int cnt1=0,cnt2=0;
52         for(int i=1;i<=26;i++){
53             if(visit[i]){
54                 if(in[i]-out[i]==1) cnt1++;
55                 else if(out[i]-in[i]==1) cnt2++;
56                 else if(in[i]!=out[i]) {flag=false;break;}
57             }
58         }
59         if(!flag){
60             printf("The door cannot be opened.\n");
61             //continue;
62         }
63         else if((cnt1==1&&cnt2==1)||(cnt1==0&&cnt2==0)) puts("Ordering is possible.");
64         else puts("The door cannot be opened.");
65     }
66     return 0;
67 }
时间: 2024-10-19 18:07:15

POJ 1386 单词接龙问题的相关文章

poj 1386 欧拉路径

1 /* 2 题意:给出N个单词,一个单词的头字母和另一个单词的尾字母相同则可以相连,问这N个单词是否能完全相连成一行 3 4 题解:求欧拉路径 5 首先以每个单词的首字母和尾字母为点并且连边,然后用DFS求该图是否连通,然后根据点的入度和出度判断是否存在 6 欧拉路径或者欧拉回路(存在回路也是符合要求的) 7 */ 8 #include <cstdio> 9 #include <cstring> 10 11 int map[30][30]; 12 int in[30],out[3

poj 1386 Play on Words 有向图欧拉路径判断

题意: 给n个单词,问是否可以将他们排成一排,使得前一个单词的末字符和后一个单词的首字符相同. 分析: 把每个单词看成一条边,转化为有向图是否存在欧拉路径问题. 代码: //poj 1386 //sep9 #include <iostream> #include <vector> #include <algorithm> #include <map> #include <string> using namespace std; const int

poj 1386 Play on Words(有向图欧拉回路)

1 /* 2 题意:单词拼接,前一个单词的末尾字母和后一个单词的开头字母相同 3 思路:将一个单词的开头和末尾单词分别做两个点并建一条有向边!然后判断是否存在欧拉回路或者欧拉路 4 5 再次强调有向图欧拉路或欧拉回路的判定方法: 6 (1)有向图G为欧拉图(存在欧拉回路),当且仅当G的基图连通,且所有顶点的入度等于出度. 7 (2)有向图G为半欧拉图(存在欧拉道路),当且仅当G的基图连通,且存在顶点u的入度比出度大1.v的入度比出度小1, 8 其它所有顶点的入度等于出度(顶点u,v的个数必须都是

POJ 1386 Play on Words

欧拉回路问题. 题意是说给你一些字符串,类似于成语接龙,上一个字符串尾字母必须和下一个字符串首字母相同. 把所有字符串连成一串. 根据定理判断欧拉通路,然后DFS判连通(并查集也可) 没注意题意 字符串开了str[100] 结果RE.结果字符串最长有1000.改了就AC了. #include<cstdio> #include<cstring> #include<string> #include<queue> #include<algorithm>

HDU 1116 || POJ 1386 || ZOJ 2016 Play on Words (欧拉回路+并查集)

题目链接 题意 : 有很多门,每个门上有很多磁盘,每个盘上一个单词,必须重新排列磁盘使得每个单词的第一个字母与前一个单词的最后一个字母相同.给你一组单词问能不能排成上述形式. 思路 :把每个单词看成有首字母指向尾字母的有向边,每个字母看成一个点,题中要求等效于判断图中是否存在一条路径经过每一条一次且仅一次,就是有向欧拉通路.统计个顶点的出入度,如果每个点的出入度都相同,那就是欧拉回路,如果有两个奇数度,那就是欧拉通路,除此之外,都不能满足要求.还有别忘了判断是否连通,此时用到并查集,图中所有的边

单词接龙(codevs 1018)

2000年NOIP全国联赛普及组NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如a

NOIP2000 单词接龙

题三.  单词接龙                (27分)    问题描述    单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at 和 atide 间不能相连.  输   入  输入的第一行为一个单独的整数n (n<=2

洛谷 P1019 单词接龙 深搜

题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都最多在"龙"中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at 和 atide 间不能相连. 输入输出格式 输入格式: 输入的第一行为一个单独的整数n (n<=20)表示单词数,以下n 行每

luogu 1019 单词接龙 dfs细节

P1019 单词接龙 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at 和 atide 间不能相连. 输入输出格式 输入格式: 输入的第一行为一个单独的整数n (n<=20)表示单词数,以下n 行每行有一个单词,