题目大意:给出一系列单词,当某个单词的首字母和前一个单词的尾字母相同,则这两个单词能链接起来。给出一系列单词,问是否能够连起来。

题目分析:以单词的首尾字母为点,单词为边建立有向图,便是判断图中是否存在欧拉道路。有向图中存在欧拉路径的两个条件是:1、忽略边的方向性后,底图联通;2、奇点个数为0时、奇点个数为2并且满足起点的入度比出度小1和终点的出度比入度大1时,欧拉道路一定存在;

判断图的连通性有两种方法:1、利用并查集,只判断有几个根节点即可;2、使用DFS,做法实质上就是判断联通块的个数;

利用并查集:

# include<iostream>
# include<cstdio>
# include<map>
# include<set>
# include<string>
# include<cstring>
# include<algorithm>
using namespace std; int n,in[26],out[26],fa[26],mark[26];
char p[1005]; int fin(int u)
{
int x=u;
while(fa[u]!=u)
u=fa[u];
while(fa[x]!=u){
int k=fa[x];
fa[x]=u;
x=k;
}
return u;
} int get()
{
int cnt=0;
for(int i=0;i<26;++i)
if(mark[i]&&fa[i]==i)
++cnt;
return cnt;
} bool judge()
{
if(get()>1)
return false; int cnt=0;
for(int i=0;i<26;++i)
if(mark[i]&&in[i]!=out[i])
++cnt;
if(cnt>2)
return false;
if(cnt==0)
return true;
if(cnt==1)
return false; int k1=0,k2=0;
for(int i=0;i<26;++i){
if(mark[i]&&in[i]!=out[i]){
if(in[i]+1==out[i])
k1=1;
if(in[i]==out[i]+1)
k2=1;
}
}
return k1&&k2;
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(in,0,sizeof(in));
memset(out,0,sizeof(out));
memset(mark,0,sizeof(mark));
for(int i=0;i<26;++i) fa[i]=i;
scanf("%d",&n);
for(int i=0;i<n;++i){
scanf("%s",p);
int l=strlen(p);
mark[p[0]-'a']=mark[p[l-1]-'a']=1;
++out[p[0]-'a'];
++in[p[l-1]-'a'];
int u=fin(p[0]-'a');
int v=fin(p[l-1]-'a');
if(u!=v)
fa[u]=v;
}
if(judge())
printf("Ordering is possible.\n");
else
printf("The door cannot be opened.\n");
}
return 0;
}

  

使用DFS:

# include<iostream>
# include<cstdio>
# include<map>
# include<set>
# include<string>
# include<cstring>
# include<algorithm>
using namespace std; int n,in[26],out[26],mark[26],vis[26],mp[26][26];
char p[1005]; void dfs(int u)
{
for(int i=0;i<26;++i){
if(mark[i]&&!vis[i]&&mp[u][i]){
vis[i]=1;
dfs(i);
}
}
} bool judge()
{
int cnt=0;
memset(vis,0,sizeof(vis));
for(int i=0;i<26;++i){
if(mark[i]&&!vis[i]){
++cnt;
vis[i]=1;
dfs(i);
}
}
if(cnt>1)
return false; for(int i=0;i<26;++i)
if(mark[i]&&vis[i]==0)
return false; cnt=0;
for(int i=0;i<26;++i)
if(mark[i]&&in[i]!=out[i])
++cnt;
if(cnt>2)
return false;
if(cnt==0)
return true;
if(cnt==1)
return false; int k1=0,k2=0;
for(int i=0;i<26;++i){
if(mark[i]&&in[i]!=out[i]){
if(in[i]+1==out[i])
k1=1;
if(in[i]==out[i]+1)
k2=1;
}
}
return k1&&k2;
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(in,0,sizeof(in));
memset(mp,0,sizeof(mp));
memset(out,0,sizeof(out));
memset(mark,0,sizeof(mark));
scanf("%d",&n);
for(int i=0;i<n;++i){
scanf("%s",p);
int l=strlen(p);
mp[p[0]-'a'][p[l-1]-'a']=mark[p[0]-'a']=mark[p[l-1]-'a']=1;
++out[p[0]-'a'];
++in[p[l-1]-'a'];
} if(judge())
printf("Ordering is possible.\n");
else
printf("The door cannot be opened.\n");
}
return 0;
}

  

UVA-10129 Play on Words (判断欧拉道路的存在性)的更多相关文章

  1. UVa 10129 Play On Words【欧拉道路 并查集 】

    题意:给出n个单词,问这n个单词能否首尾接龙,即能否构成欧拉道路 按照紫书上的思路:用并查集来做,取每一个单词的第一个字母,和最后一个字母进行并查集的操作 但这道题目是欧拉道路(下面摘自http:// ...

  2. UVA 10129 Play on Words(欧拉道路)

    题意:给你n个字符串,问你是否可以出现一条链,保证链中每个字符串的第一个元素与上一个字符串的最后一个元素相同,注意可能重复出现同一个字符串 题解:以每一个字符串第一个元素指向最后一个元素形成一个有向图 ...

  3. Uva 10129 - Play on Words 单词接龙 欧拉道路应用

    跟Uva 10054很像,不过这题的单词是不能反向的,所以是有向图,判断欧拉道路. 关于欧拉道路(from Titanium大神): 判断有向图是否有欧拉路 1.判断有向图的基图(即有向图转化为无向图 ...

  4. UVA 10441 - Catenyms(欧拉道路)

    UVA 10441 - Catenyms 题目链接 题意:给定一些单词,求拼接起来,字典序最小的,注意这里的字典序为一个个单词比过去,并非一个个字母 思路:欧拉回路.利用并查集判联通,然后欧拉道路判定 ...

  5. 【UVa】12118 Inspector's Dilemma(欧拉道路)

    题目 题目     分析 很巧秒的一道题目,对着绿书瞎yy一会. 联一下必须要走的几条边,然后会形成几个联通分量,统计里面度数为奇数的点,最后再减去2再除以2.这样不断相加的和加上e再乘以t就是答案, ...

  6. Nyoj42 一笔画问题 (欧拉道路)

    http://acm.nyist.net/JudgeOnline/problem.php?pid=42题目链接 #include <cstdio> #include <cstring ...

  7. POJ 2513 Colored Sticks(欧拉道路+字典树+并查集)

    http://poj.org/problem?id=2513 题意: 给定一些木棒,木棒两端都涂上颜色,求是否能将木棒首尾相接,连成一条直线,要求不同木棒相接的一边必须是相同颜色的. 思路: 题目很明 ...

  8. UVA10129———欧拉道路

    题目 输入n(n≤100000)个单词,是否可以把所有这些单词排成一个序列,使得每个单词的第一个字母和上一个单词的最后一个字母相同(例如 acm,malform,mouse).每个单词最多包含1000 ...

  9. poj2480(利用欧拉函数的积性求解)

    题目链接: http://poj.org/problem?id=2480 题意:∑gcd(i, N) 1<=i <=N,就这个公式,给你一个n,让你求sum=gcd(1,n)+gcd(2, ...

随机推荐

  1. CH1401 兔子与兔子【字符串】【HASH】

    1401 兔子与兔子 0x10「基本数据结构」例题 描述 很久很久以前,森林里住着一群兔子.有一天,兔子们想要研究自己的 DNA 序列.我们首先选取一个好长好长的 DNA 序列(小兔子是外星生物,DN ...

  2. BBS - 后台管理

    一.添加文章 注: 后台管理页面,应该有个新得 app /blog/backend/ # 文章列表页/blog/add_article/ # 添加文章 # 后台管理re_path(r'backend/ ...

  3. .NET、NET Framewor以及.NET Core的关系(二)

    什么是CLR,.NET虚拟机? 实际上,.NET不仅提供了自动内存管理的支持,他还提供了一些列的如类型安全.应用程序域.异常机制等支持,这些 都被统称为CLR公共语言运行库. CLR是.NET类型系统 ...

  4. Spring源码解析(三)BeanDefinition的载入、解析和注册

    通过上一篇源码的分析已经完成了BeanDefinition资源文件的定位,本篇继续分析BeanDefinition资源文件的载入和解析. AbstractBeanDefinitionReader的lo ...

  5. PhotoSwipe中文API(一)

    入门 您应知道之前先做起事情: 1. PhotoSwipe不是一个简单的jQuery插件,至少基本的JavaScript知识才能安装. 2. PhotoSwipe需要预定义的图像尺寸(更多关于这一点) ...

  6. 前端页面汉子显示为问号,需修改 linux下面修改mysql 数据库的字符编码为utf8

    设置MySQL数据库编码为UTF-8 登陆后查看数据库当前编码:SHOW VARIABLES LIKE 'char%'; 修改/etc/mysql/my.cnf (默认安装路径下) (标签下没有的添加 ...

  7. VS2010/MFC编程入门之二十七(常用控件:图片控件Picture Control)

    上一节中鸡啄米讲的是滚动条控件,本节主要讲一种简单实用的控件,图片控件Picture Control.我们可以在界面某个位置放入图片控件,显示图片以美化界面. 图片控件简介 图片控件和前面讲到的静态文 ...

  8. DNS服务器配置实践

    实验背景:在Linux系统上配置主要DNS服务器和辅助DNS服务器,所在域名为example.com,子网为192.168.X.0. 启动已安装LINUX系统,进行DNS服务器配置. 一.配置主要DN ...

  9. 【android】开发中遇到的一些问题

    1:华为输入法,输入框为ACTION_DONE模式,ActionId是 UNSPECIFIED EditText对象.setImeOptions(EditorInfo.IME_ACTION_DONE) ...

  10. 常用DOS命令总结

    本文主要参考:http://www.jb51.net/article/12360.htm http://blog.csdn.net/kofterry/article/details/5183110 常 ...