HDU 1116 || POJ 1386 || ZOJ 2016 Play on Words (欧拉回路+并查集)
题意 : 有很多门,每个门上有很多磁盘,每个盘上一个单词,必须重新排列磁盘使得每个单词的第一个字母与前一个单词的最后一个字母相同。给你一组单词问能不能排成上述形式。
思路 :把每个单词看成有首字母指向尾字母的有向边,每个字母看成一个点,题中要求等效于判断图中是否存在一条路径经过每一条一次且仅一次,就是有向欧拉通路。统计个顶点的出入度,如果每个点的出入度都相同,那就是欧拉回路,如果有两个奇数度,那就是欧拉通路,除此之外,都不能满足要求。还有别忘了判断是否连通,此时用到并查集,图中所有的边(u,v),如果u!=v且属于不同的连通分量,就合并。欧拉回路的基本定理及概念。
#include <cstdio>
#include <cstring>
#include <iostream> using namespace std ; char word[] ;
int father[],out[],in[] ,vis[]; int find_(int x)
{
if(father[x] != x)
father[x] = find_(father[x]) ;
return father[x] ;
} void mergee(int a,int b)
{
if(find_(a) != find_(b))
father[find_(a)] = find_(b) ;
} void Init()
{
memset(out,,sizeof(out)) ;
memset(in,,sizeof(in)) ;
for(int i = ; i < ; i++)
father[i] = i ;
memset(vis,,sizeof(vis)) ;
} int main()
{
int T ;
cin >> T ;
int n ;
while(T--)
{
cin >> n ;
Init() ;
while(n -- )
{
scanf("%s",word) ;
int u = word[]-'a' ;
int v = word[strlen(word)-]-'a' ;
mergee(u,v) ;
out[u] ++ ;
in[v] ++ ;
vis[u] = vis[v] = ;
}
int cnt = ,cnt1 = ,cnt2 = ;
for(int i = ; i < ; i++)
{
if(vis[i] && father[i] == i)
{
cnt ++ ;
}
}
if(cnt > )
{
puts("The door cannot be opened.") ;
continue ;
}
bool flag = true ;
for(int i = ; i < ; i++)
{
if(vis[i] && out[i] != in[i])
{
if(out[i]-in[i] == )
{
cnt1 ++ ;
if(cnt1 > )
{
flag = false ;
break ;
}
}
else if(in[i]-out[i] == )
{
cnt2 ++ ;
if(cnt2 > )
{
flag = false ;
break ;
}
}
else
{
flag = false ;
break ;
}
}
}
if(!flag) puts("The door cannot be opened.") ;
else puts("Ordering is possible.") ;
}
return ;
}
HDU 1116 || POJ 1386 || ZOJ 2016 Play on Words (欧拉回路+并查集)的更多相关文章
- poj 1386 Play on Words 有向欧拉回路
题目链接:http://poj.org/problem?id=1386 Some of the secret doors contain a very interesting word puzzle. ...
- hdu 4424 & zoj 3659 Conquer a New Region (并查集 + 贪心)
Conquer a New Region Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- poj 1386 Play on Words门上的单词【欧拉回路&&并查集】
题目链接:http://poj.org/problem?id=1386 题目大意:给你若干个字符串,一个单词的尾部和一个单词的头部相同那么这两个单词就可以相连,判断给出的n个单词是否能够一个接着一个全 ...
- hdu 1116 欧拉回路+并查集
http://acm.hdu.edu.cn/showproblem.php?pid=1116 给你一些英文单词,判断所有单词能不能连成一串,类似成语接龙的意思.但是如果有多个重复的单词时,也必须满足这 ...
- HDU 1116 Play on Words(欧拉回路+并查集)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1116 Play on Words Time Limit: 10000/5000 MS (Java/Ot ...
- 【POJ 1988】 Cube Stacking (带权并查集)
Cube Stacking Description Farmer John and Betsy are playing a game with N (1 <= N <= 30,000)id ...
- 【POJ 1984】Navigation Nightmare(带权并查集)
Navigation Nightmare Description Farmer John's pastoral neighborhood has N farms (2 <= N <= 40 ...
- POJ 1703 Find them, Catch them (数据结构-并查集)
Find them, Catch them Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 31102 Accepted: ...
- HDU 3038 - How Many Answers Are Wrong - [经典带权并查集]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3038 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...
随机推荐
- 分享我常用的一些JS验证和函数
下面是我常用一些JS验证和函数,有一些验证我直接写到了对象的属性里面了,可以直接通过对象.方法来调用//浮点数除法运算 function fdiv(a, b, n) { if (n == undefi ...
- XCode6之后预编译文件的创建
首先,在你的项目创建一个.pch预编译头文件(一直点Next)
- php判断来源网址地址并且限制非法来源
$fromHost = array( 'paipai.com', 'localhost', '127.0.0.1' ); $s = 'http://www.paipai.Com/chong/abc.s ...
- modelsim仿真错误解决办法
编译不成功可能是因为: 1.本身程序有问题. 2.没有设置顶层文件 3.modelsim 出现错误是不要只是看错误的地方,也要看前面的一部分
- 模仿cocos2dx 风格用工厂方法,实现class A,不使用宏,
class A { static A *create(); bool init(); }; A* A::create() { A *pRet=new A; if(pRet && pRe ...
- OA Framework - How to Find the Correct Version of JDeveloper to Use with E-Business Suite 11i or Release 12.x (Doc ID 416708.1)
APPLIES TO: Oracle Applications Framework - Version 11.5.10.0 to 12.2.2 [Release 11.5.10 to 12.2] In ...
- linux查看tomcat版本
进入tomcat bin目录下 然后执行 ./version.sh Server version: Apache Tomcat/6.0.26Server built: March 9 2010 1 ...
- python解析xml之lxml
虽然python解析xml的库很多,但是,由于lxml在底层是用C语言实现的,所以lxml在速度上有明显优势.除了速度上的优势,lxml在使用方面,易用性也非常好.这里将以下面的xml数据为例,介绍l ...
- Java Synchronized Blocks vs. Methods
It's possible to synchronize both an entire method and a section of code within a method, and you ma ...
- Vim 常用命令 一
今天第一次学习了 Vim编辑器的一些使用 拿出来和大家分享下. 1.首先 列出 常用快捷键 u 表示 撤销上一步 x 表示 删除光标位内容 dd 表示 删除光标所在行内容 >G 表示 光标 ...