UVA-10129 Play on Words (判断欧拉道路的存在性)
题目大意:给出一系列单词,当某个单词的首字母和前一个单词的尾字母相同,则这两个单词能链接起来。给出一系列单词,问是否能够连起来。
题目分析:以单词的首尾字母为点,单词为边建立有向图,便是判断图中是否存在欧拉道路。有向图中存在欧拉路径的两个条件是: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 (判断欧拉道路的存在性)的更多相关文章
- UVa 10129 Play On Words【欧拉道路 并查集 】
题意:给出n个单词,问这n个单词能否首尾接龙,即能否构成欧拉道路 按照紫书上的思路:用并查集来做,取每一个单词的第一个字母,和最后一个字母进行并查集的操作 但这道题目是欧拉道路(下面摘自http:// ...
- UVA 10129 Play on Words(欧拉道路)
题意:给你n个字符串,问你是否可以出现一条链,保证链中每个字符串的第一个元素与上一个字符串的最后一个元素相同,注意可能重复出现同一个字符串 题解:以每一个字符串第一个元素指向最后一个元素形成一个有向图 ...
- Uva 10129 - Play on Words 单词接龙 欧拉道路应用
跟Uva 10054很像,不过这题的单词是不能反向的,所以是有向图,判断欧拉道路. 关于欧拉道路(from Titanium大神): 判断有向图是否有欧拉路 1.判断有向图的基图(即有向图转化为无向图 ...
- UVA 10441 - Catenyms(欧拉道路)
UVA 10441 - Catenyms 题目链接 题意:给定一些单词,求拼接起来,字典序最小的,注意这里的字典序为一个个单词比过去,并非一个个字母 思路:欧拉回路.利用并查集判联通,然后欧拉道路判定 ...
- 【UVa】12118 Inspector's Dilemma(欧拉道路)
题目 题目 分析 很巧秒的一道题目,对着绿书瞎yy一会. 联一下必须要走的几条边,然后会形成几个联通分量,统计里面度数为奇数的点,最后再减去2再除以2.这样不断相加的和加上e再乘以t就是答案, ...
- Nyoj42 一笔画问题 (欧拉道路)
http://acm.nyist.net/JudgeOnline/problem.php?pid=42题目链接 #include <cstdio> #include <cstring ...
- POJ 2513 Colored Sticks(欧拉道路+字典树+并查集)
http://poj.org/problem?id=2513 题意: 给定一些木棒,木棒两端都涂上颜色,求是否能将木棒首尾相接,连成一条直线,要求不同木棒相接的一边必须是相同颜色的. 思路: 题目很明 ...
- UVA10129———欧拉道路
题目 输入n(n≤100000)个单词,是否可以把所有这些单词排成一个序列,使得每个单词的第一个字母和上一个单词的最后一个字母相同(例如 acm,malform,mouse).每个单词最多包含1000 ...
- poj2480(利用欧拉函数的积性求解)
题目链接: http://poj.org/problem?id=2480 题意:∑gcd(i, N) 1<=i <=N,就这个公式,给你一个n,让你求sum=gcd(1,n)+gcd(2, ...
随机推荐
- [ASP.NET]从Request.Url获取根网址的最简单方法
在拼接绝对路径的网址时,经常需要从Request.Url中获取根网址(比如http://www.cnblogs.com),然后与相对路径一起拼接为绝对路径. 以前的做法如下: var uri = Re ...
- vue - 准备知识
一.知识 http://www.cnblogs.com/majj/https://www.cnblogs.com/majj/category/1216624.html 阮一峰 es6http://es ...
- windows 系统无法启动windows event log 服务
windows 系统无法启动windows event log 服务 关键词:无法启动系统事件日志 尝试解决步骤 [1]权限:把如图中logsfile文件等都给local service [2]把C: ...
- mysql 数据操作 单表查询
单表查询的语法 distinct 去重 SELECT 字段1,字段2... FROM 表名 库.表名 WHERE 条件 过滤 符合条件的 GROUP BY field 分组条件 HAVING 筛选 过 ...
- centos 目录结构 快捷键 ls命令,alias别名,so:动态库 a:静态库,环境变量PATH,Ctrl+z 暂停命令,Ctrl+a 光标到行首,Ctrl+e 光标到行尾,Ctrl+u 删除光标前所有字符 Ctrl+r 搜索命 hash命令 Ctrl+左箭头/右箭头 cd命令 第三节课
centos 目录结构 快捷键 ls命令,alias别名,so:动态库 a:静态库,环境变量PATH,Ctrl+z 暂停命令,Ctrl+a 光标到行首,Ctrl+e 光标到行尾,Ctrl+u 删除光标 ...
- java-基础-【二】内部类与静态内部类
一.说明 java允许我们在一个类里面定义静态类.比如内部类(nested class).把nested class封闭起来的类叫外部类.在java中,我们不能用static修饰顶级类(top lev ...
- go-004-数据结构
在 Go 编程语言中,数据类型用于声明函数和变量. 数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,就可以充分利用内存. Go 语言按类别有以下几种 ...
- SaltStack系列(三)之state相关介绍
一.管理对象 saltstack系统中管理对象叫做Target,在master上可以采用不同的Tatget去管理不同的minion.这些Target都是通过去管理和匹配Minion的ID来做一些集合. ...
- java基础知识 构造方法
在java里面,构造方法也就是构造函数 构造函数=构造方法;构造方法是一种特殊的方法,具有以下特点.(1)构造方法的方法名必须与类名相同.(2)构造方法没有返回类型,也不能定义为void,在方法名前面 ...
- Bootstrap单按钮的下拉菜单
简介 把任意一个按钮放入 .btn-group 中,然后加入适当的菜单标签,就可以让按钮作为菜单的触发器了. 插件依赖 按钮式下拉菜单依赖下拉菜单插件 ,因此需要将此插件包含在你所使用的 Bootst ...