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 ...
随机推荐
- 一个.net程序员教你使用less
我是一个.net 程序员,虽然说一直做后台,但是web 前端也会去学,虽然说技术只是层窗户纸,但是像我这种多动症患者,不捅破我心难受啊! 好!废话不多提,下面直接正题,至于less 是什么这里不多讲因 ...
- zeromq
分布式系统之分布式中间件zeroMQ zeroMQ,又称0MQ,是一个非常简单的通信库,它扩展了传统BSD socket能力,提供简单的基于消息的通信.zeroMQ不解析消息体,没有序列化能力,或者说 ...
- Go中简单的文件读写
Go中的ioutil包可以方便的实现文件读写.代码: package main import ( "fmt" "io/ioutil" ) func main() ...
- 62.在cdc文件上某些例化模块看不到的原因
比如在顶层文件中,例化了几个模块,综合后打开cdc文件,会在structure/net中少几个例化模块,即看不到,但在顶层文件中还是存在的,只是ISE软件综合的问题而已,原因是在顶层或子模块中,有些应 ...
- python中将字符串转化为本地变量
var = 123445s= locals()['var']s2=vars()['var'] print s,s2
- Android 锁屏软件MemoryDebris测试报告
目 录 项目基本信息 第1章 引言 1.1 编写目的 1.2 项目背景 1.3 参考资料 1.4 术语和缩略语 第2章 ...
- 【Path Sum】cpp
题目: Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up ...
- 【Python】代码调试(pdb与logging使用)
一.pdb使用 pdb 是 python 自带的一个包,为 python 程序提供了一种交互的源代码调试功能,主要特性包括设置断点.单步调试.进入函数调试.查看当前代码.查看栈片段.动态改变变量的值等 ...
- mysql解决错误的方法-MySQL日志
1.使用ps -ef|grep mysql查询是否有与MySQL相关的僵尸进程,如果有则强制杀掉 2.在配置文件my.cnf中配置启动错误日志: log_error = /var/log/mysql/ ...
- Swift-6-函数
// Playground - noun: a place where people can play import UIKit // 定义和调用函数 func sayHello(personName ...