1185. 单词游戏(欧拉路径)

活动 - AcWing

有 N 个盘子,每个盘子上写着一个仅由小写字母组成的英文单词。

你需要给这些盘子安排一个合适的顺序,使得相邻两个盘子中,前一个盘子上单词的末字母等于后一个盘子上单词的首字母。

请你编写一个程序,判断是否能达到这一要求。

输入格式

第一行包含整数 T,表示共有 T 组测试数据。

每组数据第一行包含整数 N,表示盘子数量。

接下来 N 行,每行包含一个小写字母字符串,表示一个盘子上的单词。

一个单词可能出现多次。

输出格式

如果存在合法解,则输出”Ordering is possible.”,否则输出”The door cannot be opened.”。

数据范围

1≤N≤105
单词长度均不超过1000

输入样例:
3
2
acm
ibm
3
acm
malform
mouse
2
ok
ok
输出样例:
The door cannot be opened.
Ordering is possible.
The door cannot be opened.

解析: 

一、在无向图中(所有边都是连通的): 

(1)存在欧拉路径的充分必要条件:度数为奇数的点只能有0或2。 

(2)存在欧拉回路(起点和终点相同)的充分必要条件:度数为奇数的点只能有0个。 

二、在有向图中(所有边都是连通的): 

(1)存在欧拉路径的充分必要条件:要么所有点的入度均等于入度;要么除了两个点之外,其余所有的点的出度等于入度,剩余的两个点:一个满足出度比入度多1(起点),另一个满足入度比出度多1(终点)。 

(2)存在欧拉回路(起点和终点相同)的充分必要条件:所有点的入度均等于出度。 

欧拉回路的dfs用边来判重,不能用点。 

本题的建图方式与《单词环》很像:1165. 单词环 (01分数规划,建图,经验值优化,正环)-CSDN博客

1.建图:将每个字符串看成一条边,边的两个端点为字符串首尾的两个字符

然后再根据上述概念判断是否存在欧拉路径即可。

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<math.h>
#include<map>
#include<sstream>
#include<deque>
#include<unordered_map>
#include<unordered_set>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
const int N = 30, M = 2e3, INF = 0x3f3f3f3f;
int n, m;
int din[N], dout[N], st[N];
int p[N];int find(int u) {if (p[u] == u)return u;return p[u] = find(p[u]);
}int main() {int T;cin >> T;while (T--) {cin >> n;memset(st, 0, sizeof st);memset(din, 0, sizeof din);memset(dout, 0, sizeof dout);for (int i = 0; i < 26; i++)p[i] = i;char s[M];for (int i = 1; i <= n; i++) {scanf("%s", s);int len = strlen(s);int a = s[0] - 'a', b = s[len - 1] - 'a';din[a]++, dout[b]++;p[find(a)] = find(b);st[a] = st[b] = 1;}int start = 0, end = 0;int success = 1;for (int i = 0; i <= 26; i++) {if (din[i] != dout[i]) {if (din[i] == dout[i] + 1)end++;else if (din[i] + 1 == dout[i])start++;else {success = 0;break;}}}if (success && !(!start && !end || start == 1 && end == 1))success = 0;int rep = -1;for (int i = 0; i < 26; i++) {if (st[i]) {if (rep == -1)rep = find(i);else if (rep != find(i)) {success = 0;break;}}}if (success)cout << "Ordering is possible." << endl;else cout << "The door cannot be opened." << endl;}return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/681470.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 0987.二叉树的垂序遍历:遍历时存节点信息,遍历完自定义排序

【LetMeFly】987.二叉树的垂序遍历&#xff1a;遍历时存节点信息&#xff0c;遍历完自定义排序 力扣题目链接&#xff1a;https://leetcode.cn/problems/vertical-order-traversal-of-a-binary-tree/ 给你二叉树的根结点 root &#xff0c;请你设计算法计算二叉树的 垂序遍历…

【AutoGen】多个AI代理协同工作

【AutoGen】多个AI代理协同工作 Autogen是一个卓越的人工智能系统&#xff0c;它可以创建多个人工智能代理&#xff0c;这些代理能够协作完成任务&#xff0c;包括自动生成代码&#xff0c;并有效地执行任务。 这个框架主要解决的是在开发此类复杂应用程序时&#xff0c;工作…

2024/2/13 图的基础知识 3(拓扑排序)

目录 最长路 P1807 最长路 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) Divide by three, multiply by two Problem - 977D - Codeforces 最长路 P1807 最长路 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路&#xff1a;使用拓扑排序&#xff0c;开两个二维数组…

局部加权回归

局部加权回归&#xff08;Local Weighted Regression&#xff09;是一种非参数回归方法&#xff0c;用于解决线性回归模型无法很好拟合非线性数据的问题。它通过给不同的样本赋予不同的权重&#xff0c;使得在拟合模型时更加关注靠近目标点附近的样本数据。 局部加权回归的基本…

【C语言】【力扣】7.整数反转和9.回文数

一、整数反转 1.1 个人思考过程 初解&#xff1a;出现ERROR&#xff0c;数据溢出的情况下应该返回0。&#xff08;错误&#xff09; int reverse(int x){int y0;while(x!0){yy*10x%10;x/10; }return y; } 再解&#xff1a;加上数据溢出判断条件。&#xff08;正确&#…

寒假学习记录14:JS字符串

目录 查找字符串中的特定元素 String.indexOf() &#xff08;返回索引值&#xff09; 截取字符串的一部分 .substring() &#xff08;不影响原数组&#xff09;&#xff08;不允许负值&#xff09; 截取字符串的一部分 .slice() &#xff08;不影响原数…

拥抱Java 21—— main 函数精简和未命名模式的变化

Java 21 已经在2023年9月19日正式发布了。Java 21是最新的LTS&#xff08;Long Time Support&#xff09;版本&#xff0c;因此还没发布时就引起了许多开发人员的关注。此次版本升级&#xff0c;一共有 15 个功能进行了更新。 在这 15 个功能更新中&#xff0c;有类似于 ZGC、…

“bound drug/molecule”or “unbound drug/molecule”、molecule shape、sketching是什么?

“bound drug/molecule”or “unbound drug/molecule” For clarity, the following terms will be used throughout this study: “bound drug/molecule” (or “unbound drug/molecule”) refers to the drug/molecule that is bound (or unbound) to proteins [48]. 意思就是…

【C语言】简易英语词典

文章目录 一、定义英语单词信息的结构体二、主函数功能逻辑三、查单词函数四、背单词函数五、补充 一、定义英语单词信息的结构体 添加必要的头文件、宏定义和声明&#xff0c;之后定义英语单词信息结构体。 /* 头文件和宏定义 */ #include <stdio.h> #include <std…

Java实现快乐贩卖馆管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 搞笑视频模块2.3 视频收藏模块2.4 视频评分模块2.5 视频交易模块2.6 视频好友模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 搞笑视频表3.2.2 视频收藏表3.2.3 视频评分表3.2.4 视频交易表 四、系…

【前沿技术杂谈:AI 模型训练成本】到 2030 年,AI 模型训练成本预计将从 1 亿美元增加到 5 亿美元

【前沿技术杂谈&#xff1a;AI 模型训练成本】到 2030 年&#xff0c;AI 模型训练成本预计将从 1 亿美元增加到 5 亿美元 简述五年后&#xff0c;人工智能将掌握在谁的手中&#xff1f; 简述 根据 OpenAI 最近的一份报告&#xff0c;到 2030 年&#xff0c;训练大型 AI 模型的成…

AutoSAR(基础入门篇)8.6-实验:配置I/O

注意: 本次实验是接着上一次实验做的,大家应该要养成一个良好的习惯就是备份工程。比如我们现在是接着上次做的,但是最好在开始前将之前的工程备 份一遍,以防止出错重来。当然,最好的方法还是使用Git管理。还有一点要说明的是:很多之前实验中出现过的操作我们不再重复展…

npm报错之package-lock.json found. 问题和淘宝镜像源过期问题

1、package-lock.json found. 问题的解决 在执行yarn add react-transition-group -S 安装react-transition-group时出现package-lock.json found. Your project contains lock files generated by tools other than Yarn. It is advised not to mix package managers in orde…

Vue 新版 脚手架 初始化 笔记

Vue2/Vue3 修改 node 更新源 将默认的 更新源修改为 淘宝的 下载地址 PS C:\Users\Administrator> npm config set registry https://registry.npm.taobao.org PS C:\Users\Administrator>npm config get registry https://registry.npm.taobao.org/安装 npm install…

Mybatis Day02

增删改查 环境准备 创建一个emp表创建一个新的springboot工程&#xff0c;选择mysql、lombok、mybatis依赖application.properties中引入数据库连接信息创建对应的实体类Emp准备Mapper接口EmpMapper&#xff0c;mapper代表程序运行时自动创建接口的代理对象&#xff0c;并放入…

算法学习(三)双指针

双指针 1. 概念 4.1 数组里的双指针 用暴力解法一定可解&#xff0c;双重循环得出结果。使用双指针的方法&#xff0c;可以借助一个额外变量&#xff0c;实现降维优化。 &#xff08;1&#xff09;相反方向运动 两个指针在数组的头和尾&#xff0c;都往中间移动&#xff0c…

EasyCaptcha,开源图形验证码新标杆!

引言&#xff1a; 随着互联网的普及&#xff0c;验证码已成为网站和应用程序中不可或缺的安全组件。它能够有效地防止自动化攻击、垃圾邮件和机器人活动。在众多验证码解决方案中&#xff0c;Easy-captcha以其简单易用和高度可定制的特点受到了开发者的青睐。本文将指导读者如…

v-model原理

v-model原理 v-model原理表单类组件封装v-model简化代码 v-model原理 1.原理&#xff1a; v-model本质上是一个语法糖。例如应用在输入框上&#xff0c;就是value属性 和 input 事件的合写 <template><div id"app" ><input v-model"msg"…

Linux 基础概念

Linux 基础概念 ‍ 在最初学习Linux之前&#xff0c;首先需要搞清楚一些概念。熟悉这些概念之后紧接着熟悉各种命令&#xff0c;这有助于Linux命令的学习。这些概念绝对是你必须知道的&#xff0c;而且有些概念并不显而易见。但是当理解它们以后&#xff0c;你的shell命令也将…

Java 学习和实践笔记(8)

视频解释说&#xff0c;上图不用我们常规的写法&#xff0c;仅仅只是为了在同样的情况下&#xff0c;少写一个a而已&#xff01;这我目前不能理解。毕竟后面这种对初学者来说&#xff0c;看起来更一目了解。