Play on Words UVA - 10129 (欧拉回路)
题目链接:https://vjudge.net/problem/UVA-10129


题目大意:输入N 代表有n个字符串 每个字符串最长1000 要求你把所有的字符串连成一个序列 每个字符串的第一个字母是前一个字符串的最后一个字母
思路:这是学的欧拉回路的第一道题 ,把单词的首字母和尾字母看做结点,单词看作边 ,判断能否找出一条欧拉回路就行了
首先要知道什么是欧拉回路:
第一个条件:图必须是连通的
第二个条件:最多只有两个奇点(出度和入度不相等的点)
满足上面两个条件的就是欧拉回路
如果有两个奇点,必须从一个奇点出发 另一个奇点终止。 不存在奇点的话 任一点出发 回到该点
注意:图是连通的是前提。
求欧拉回路有两种做法 一种是dfs 一种是并查集
我两种都写了,但是用dfs的做法 一直wa 到现在也不明白错在哪了。 所以这里就列出并查集的做法吧
#include<iostream>
#include<string.h>
#include<vector>
using namespace std;
const int maxn=+;
int pa[];
int findset(int x)//找到它的祖先
{
if(pa[x]==x) return pa[x];
return pa[x]=findset(pa[x]);
} int used[],deg[];//是否出现过 度数 int main()
{
int T;
cin>>T;
while(T--)
{
int n;
char word[maxn];
cin>>n;
memset(used,,sizeof(used));
memset(deg,,sizeof(deg));
for(int ch='a';ch<='z';ch++) pa[ch]=ch;//初始化并查集
int cc=;//连通块个数 for(int i=;i<n;i++)
{
cin>>word;
char c1=word[],c2=word[strlen(word)-];
deg[c1]++;//出度的话 ++
deg[c2]--;//入度 --
used[c1]=used[c2]=;//标记为出现过
int s1=findset(c1),s2=findset(c2);//找到他们的祖先
if(s1!=s2)//不是同一个祖先
{
pa[s1]=s2;
cc--;//连通块减一
}
}
vector<int> d;
for(int ch='a';ch<='z';ch++)
{
if(!used[ch]) cc--;//没出现过的字母
else if(deg[ch]!=) d.push_back(deg[ch]);//出度和入度不相等的结点
//=0代表出度和入度相等的结点 不需要考虑
}
bool ok=false;
if(cc==&&(d.empty()||(d.size()==&&(d[]==||d[]==-)))) ok=true;//cc=1代表只剩下一个块 为空代表成环 不为空 为2的话 一个是出度一个是入度
if(ok) cout<<"Ordering is possible."<<endl;
else cout<<"The door cannot be opened."<<endl;
}
return ;
}
Play on Words UVA - 10129 (欧拉回路)的更多相关文章
- 【紫书】Play on Words UVA - 10129 欧拉回路
题意:给你1e5个字符串,若前一个的末尾字母等于当前的首字母,则可以连在一起(成语接龙一个意思)判断是否可以将他们连在一起 题解:将首位看作点,单词看作边.变成欧拉回路问题. 判断出入度是否相等,再用 ...
- Play on Words UVA - 10129 欧拉路径
关于欧拉回路和欧拉路径 定义:欧拉回路:每条边恰好只走一次,并能回到出发点的路径欧拉路径:经过每一条边一次,但是不要求回到起始点 ①首先看欧拉回路存在性的判定: 一.无向图每个顶点的度数都是偶数,则存 ...
- UVa 10129单词(欧拉回路)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVA - 10129 Play on Words(欧拉回路+并查集)
2.解题思路:本题利用欧拉回路存在条件解决.可以将所有的单词看做边,26个字母看做端点,那么本题其实就是问是否存在一条路径,可以到达所有出现过的字符端点.由于本题还要求了两个单词拼在一起的条件是前一个 ...
- UVA - 10129 Play on Words (欧拉回路+并查集)
思路: 分别存下每个字符串的首尾字符,以字符为结点,单词看作一条变,就变成了求欧拉回路了,先判断下图是否连通,然后根据欧拉回路的结论:最多只能有两个点的入读不等于初读,而且必须是一个点的出度恰好比入度 ...
- UVA - 10129 Play on Words(欧拉回路)
题意:将n个单词排成一个序列,保证相邻单词相邻处字母相同. 分析:每个单词看做一条有向边,字母为点,并查集看图是否连通,因为是有向图,所以最多只能有两个点入度不等于出度,且这两个点一个入度比出度大1, ...
- Uva 10129 单词
题目链接:https://uva.onlinejudge.org/external/101/10129.pdf 把单词的首字母和最后一个字母看做节点,一个单词就是一个有向边.有向图的欧拉定理,就是除了 ...
- Uva 10129 - Play on Words 单词接龙 欧拉道路应用
跟Uva 10054很像,不过这题的单词是不能反向的,所以是有向图,判断欧拉道路. 关于欧拉道路(from Titanium大神): 判断有向图是否有欧拉路 1.判断有向图的基图(即有向图转化为无向图 ...
- Uva 10054 欧拉回路 打印路径
看是否有欧拉回路 有的话打印路径 欧拉回路存在的条件: 如果是有向图的话 1.底图必须是连通图 2.最多有两个点的入度不等于出度 且一个点的入度=出度+1 一个点的入度=出度-1 如果是无向图的话 1 ...
随机推荐
- rpm bug
rpm无法安装 今天安装java时候,下载的rpm的包,但是用linux打开时候发现不能正常打开. 错误详情 主要是rpm安装时候的错误,java提示的错误就没有记录了. Reading packag ...
- 【IMOOC学习笔记】多种多样的App主界面Tab实现方法(三)
FragmentPagerAdapter+ViewPager 与之前直接用ViewPager不同的是,数组里面放的不再是View,而是Fraagment; 使用FragmentPagerAdapter ...
- 【IIS】编译器失败,错误代码为 -2146232576
把新写的 ASP.NET MVC 代码发布到 阿里云虚拟机后,报如下错误: 编译器失败,错误代码为 -2146232576 参考了 iis 错误 -2146232576 和 asp.net mvc5本 ...
- idea 面板介绍
一.面板说明 IDEA面板的全貌如下图 二.菜单栏 下面会简单介绍下一些常用的部分菜单使用,如有疑问或补充欢迎留言. (1).File文件 1. New:新建一个工程 可以新建project,导入已存 ...
- History命令用法15例
以下内容为转载: 如果你经常使用 Linux 命令行,那么使用 history(历史)命令可以有效地提升你的效率.本文将通过实例的方式向你介绍 history 命令的 15 个用法. 使用 HISTT ...
- 【转】新建网站(CodeFile)与新建Web应用(Codebehind)的区别
源地址:http://www.cnblogs.com/harry0906/articles/3575725.html
- ConcurrentHashMap get方法保持同步的解释
原文链接:https://blog.csdn.net/artaganan8/article/details/80867158 ConcurrentHashMap是Java5中新增加的一个线程安全的Ma ...
- typeof 和 instanceof
typeof 和 instanceof 都是用来判断类型的函数 typeof 对于原始类型来说,除了 null 都可以显示正确的类型 typeof 1 // 'number' typeof '1' / ...
- DRF教程7-token认证
Authentication 认证是将一个传入的请求和一组标识凭据相关联的机制,比如请求过来的用户,或者用户登录时携带的token. 然后权限策略就能使用这些凭据来决定是否允许这个请求. REST框架 ...
- git commit 操作
查看提交历史 然后在此项目中运行 git log,应该会看到下面的输出: 合并commit 信息 我们需要将 2dfbc7e8 和 c4e858b5 合并成一个 commit,那么我们输入如下命令 ...