news 2026/5/14 2:16:21

洛谷 P1333:瑞瑞的木棍 ← 欧拉回路 + 并查集

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
洛谷 P1333:瑞瑞的木棍 ← 欧拉回路 + 并查集

【题目来源】
https://www.luogu.com.cn/problem/P1333

【题目描述】
瑞瑞有一堆的玩具木棍,每根木棍的两端分别被染上了某种颜色,现在他突然有了一个想法,想要把这些木棍连在一起拼成一条线,并且使得木棍与木棍相接触的两端颜色都是相同的,给出每根木棍两端的颜色,请问是否存在满足要求的排列方式。
例如,如果只有 2 根木棍,第一根两端的颜色分别为 red 和 blue,第二根两端的颜色分别为 red 和 yellow,那么 blue --- red | red --- yellow 便是一种满足要求的排列方式。

【输入格式】
输入有若干行,每行包括两个单词,表示一根木棍两端的颜色,单词由小写字母组成,且单词长度不会超过 10 个字母,最多有 250000 根木棍。​​​​​​​

【输出格式】
如果木棒能够按要求排列,输出 Possible,否则输出 Impossible。​​​​​​​

【输入样例】
blue red
red violet
cyan blue
blue magenta
magenta cyan

【输出样例】
Possible

【数据范围】
单词长度不会超过 10 个字母,最多有 250000 根木棍。​​​​​​​

【算法分析】
(一)这是一个图论问题,可以建模为无向图的欧拉路径/欧拉回路存在性问题。具体地,每个颜色是一个顶点,每根木棍是一条边,问题转化为:是否存在一条路径(或回路)能经过每条边恰好一次。这需要检查两个条件:
1. 连通性:所有边对应的顶点必须属于同一个连通分量。
2. 度(奇度数顶点数量):
• 如果所有顶点的度都是偶数,则存在欧拉回路(从任意点出发可回到起点)。
• 如果恰好有两个顶点的度是奇数,则存在欧拉路径(从一个奇度点出发,另一个结束)。
• 其他情况(奇度顶点数不是 0 或 2)则不可能。
由于颜色用字符串表示,需用 map 或 unordered_map 映射为数字编号。并查集检查连通性。

(二)用 mp 将颜色字符串映射为整数编号(从 0 开始)。
• 每读入一根木棍(c1 c2),对应顶点 u 和 v 的度加 1,并在并查集中合并。
• 读完后,检查所有出现过的顶点是否连通(即属于同一个并查集)。
• 统计奇度顶点个数,若为 0 或 2 则输出 Possible,否则输出 Impossible。

【算法代码】

#include <bits/stdc++.h> using namespace std; const int N=5e5+10; int pre[N]; int du[N]= {0}; int find(int x) { if(x!=pre[x]) pre[x]=find(pre[x]); return pre[x]; } void merge(int x,int y) { int a=find(x); int b=find(y); if(a!=b) pre[a]=b; } int main() { for(int i=0; i<N; i++) pre[i]=i; unordered_map<string,int> mp; int idx=0; string s1,s2; while(cin>>s1>>s2) { if(mp.find(s1)==mp.end()) mp[s1]=idx++; if(mp.find(s2)==mp.end()) mp[s2]=idx++; int u=mp[s1],v=mp[s2]; du[u]++,du[v]++; merge(u,v); } int n=idx; if(n==0) { cout<<"Possible"<<endl; return 0; } int root=find(0); for(int i=1; i<n; i++) { if(find(i)!=root) { cout<<"Impossible"<<endl; return 0; } } int odd=0; for(int i=0; i<n; i++) { if(du[i]%2==1) odd++; } if(odd==0 || odd==2) { cout<<"Possible"<<endl; } else cout<<"Impossible"<<endl; return 0; } /* in: blue red red violet cyan blue blue magenta magenta cyan out: Possible */



【参考文献】
https://blog.csdn.net/hnjzsyjyj/article/details/160909877
https://blog.csdn.net/hnjzsyjyj/article/details/160888941
https://blog.csdn.net/hnjzsyjyj/article/details/149031663
https://blog.csdn.net/hnjzsyjyj/article/details/140747624




版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/10 22:27:47

QueryExcel:一键批量查询Excel数据的终极效率神器

QueryExcel&#xff1a;一键批量查询Excel数据的终极效率神器 【免费下载链接】QueryExcel 多Excel文件内容查询工具。 项目地址: https://gitcode.com/gh_mirrors/qu/QueryExcel 还在为海量Excel文件中的数据查找而头疼吗&#xff1f;每天面对成百上千个Excel表格&…

作者头像 李华
网站建设 2026/5/12 14:26:59

蓝奏云直链解析:三步配置实现文件高速下载

蓝奏云直链解析&#xff1a;三步配置实现文件高速下载 【免费下载链接】LanzouAPI 蓝奏云直链&#xff0c;蓝奏api&#xff0c;蓝奏解析&#xff0c;蓝奏云解析API&#xff0c;蓝奏云带密码解析 项目地址: https://gitcode.com/gh_mirrors/la/LanzouAPI 蓝奏云直链解析A…

作者头像 李华
网站建设 2026/5/12 5:09:54

Dify 部署与使用

版本说明:本文基于 Dify 社区版最新稳定版(Docker Compose 部署方式)编写,涵盖部署原理、环境配置、Chat 应用、RAG 知识库、工作流编排及常见问题排查。 第1章 快速部署:从 0 到 1 启动 Dify 1.1 系统要求与架构概览 Dify 采用微服务架构设计,通过 Docker Compose 一…

作者头像 李华
网站建设 2026/5/12 4:32:58

番茄小说下载器:为数字阅读者打造的离线解决方案

番茄小说下载器&#xff1a;为数字阅读者打造的离线解决方案 【免费下载链接】Tomato-Novel-Downloader 番茄小说下载器不精简版 项目地址: https://gitcode.com/gh_mirrors/to/Tomato-Novel-Downloader 你是否曾在地铁上读到小说高潮时突然断网&#xff1f;是否想收藏喜…

作者头像 李华
网站建设 2026/5/10 22:19:03

BOTW存档编辑器GUI:塞尔达传说旷野之息存档自定义完全指南

BOTW存档编辑器GUI&#xff1a;塞尔达传说旷野之息存档自定义完全指南 【免费下载链接】BOTW-Save-Editor-GUI A Work in Progress Save Editor for BOTW 项目地址: https://gitcode.com/gh_mirrors/bo/BOTW-Save-Editor-GUI 想要在《塞尔达传说&#xff1a;旷野之息》中…

作者头像 李华
网站建设 2026/5/13 1:23:42

Java 9 新特性

Java 9 新特性 Java 9 是 Java 语言和平台的一次重大更新,自 2017 年 9 月 22 日发布以来,它引入了许多新特性和改进。以下是对 Java 9 的一些主要新特性的详细说明。 1. 模块化系统(Project Jigsaw) Java 9 引入了模块化系统,这是 Java 平台历史上的一次重大变革。模块…

作者头像 李华