题解【UVA10054】The Necklace
2024-08-28 18:55:16
题目描述
输入格式
输出格式
题意简述
有一种由彩色珠子连接而成的项链。每个珠子的两半由不同颜色组成。如图所示,相邻两个珠子在接触的地方颜色相同。现在有一些零碎的珠子,需要确认它们是否可以复原成完整的项链。
输入格式:
输入第一行为测试数据组数 \(T\) 。每组数据的第一行是一个整数\(N (5 ≤ N ≤ 1000 )\),表示珠子的个数。接下来的\(N\) 行每行包含两个整数,即珠子两半的颜色。颜色用\(1\)~\(50\)的整数来表示。
输出格式:
对于每组数据,输出测试数据编号和方案。如果无解,输出“some beads may be lost”。方案的格式和输入相同,也是一共\(N\) 行,每行用两个整数描述一个珠子(从左到右的顺序),其中第一个整数表示左半的颜色,第二个整数表示右半的颜色。根据题目规定,对于\(1≤i≤N-1\),第\(i\)行的第二个数必须等于第\(i+1\)行上的第一个数,且第\(N\)行的第二个数必须等于第一行的第一个数(因为项链是环形的)。如果有多解,输出任意一组即可。在相邻两组输出之间应有一个空行。
题解
这道题目是欧拉回路的经典题,不过需要通过建模才可以利用欧拉回路解题。
我们把每一种颜色都看成一个节点,把每一个珠子的两半都连一条有向边,那么这道题就变成了在一幅图中求解欧拉回路的经典题。
使用\(DFS\)进行欧拉回路的寻找,最后记得逆序输出。
通过本题,我们可以知道,数学建模在信息学上的作用很大,它是信息学中不可忽视的一个知识点。
代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cctype>//头文件准备
using namespace std;
inline int gi()
{
int f = 1, x = 0; char c = getchar();
while (c < '0' || c > '9') { if (c == '-') f = -1; c = getchar();}
while (c >= '0' && c <= '9') { x = x * 10 + c - '0'; c = getchar();}
return f * x;
}//快速读入
int n, m, g[53][53]/*存图的邻接矩阵*/, f[53]/*每个点的度*/, t/*数据组数*/, Case;
void GetEuler(int u)//欧拉回路
{
for (int i = 1; i <= 50; i++)//枚举节点
{
if (g[i][u])//如果枚举的节点与当前节点有边连接
{
--g[i][u], --g[u][i];//两点之间减去一条边
GetEuler(i);//继续遍历下一个节点
printf("%d %d\n", i, u);//注意逆序输出
}
}
}
int main()
{
t = gi();//输入数据组数
while (t--)
{
memset(g, 0, sizeof(g));
memset(f, 0, sizeof(f));//多组数据要初始化数组
n = gi();//输入珠子的个数
for (int i = 1; i <= n; i++)
{
int u = gi(), v = gi();//输入2个颜色
++g[u][v], ++g[v][u]/*连边*/, ++f[u], ++f[v]/*加上度数*/;
}
printf("Case #%d\n", ++Case);//输出这是第几组数据
int Sigma = 0;
for (int i = 1; i <= 50; i++)
{
if (f[i] & 1) //如果当前节点的度数为奇数
{
Sigma = i;//标记为有节点的度数为奇数,即没有欧拉回路
break;//直接退出循环
}
}
if (Sigma) //如果没有欧拉回路
{
puts("some beads may be lost");//输出无解
}
else
{
for (int i = 1; i <= 50; i++)
{
GetEuler(i);//否则就输出欧拉回路的路径
}
}
if (t) puts("");//每组数据后都需要空一行
}
return 0;//结束
}
最新文章
- 学习笔记---C/C++语法
- 关于如何使用Identity的文献
- C#中数组Array、ArrayList、泛型List<;T>;的比较
- 用atom写LaTeX文档
- sql查询所有表以及表名的模糊查询
- boost:exception使用实例
- WdatePicker开始日期不能大于结束日期
- [转] c# 数据类型占用的字节数
- Bzoj 3389: [Usaco2004 Dec]Cleaning Shifts安排值班 最短路,神题
- 第27篇 重复造轮子---模拟IIS服务器
- wemall doraemon中Android app商城系统向指定URL发送GET方法的请求代码
- 09_Python定义方法_Python编程之路
- 实现一个网易云音乐的 BottomSheetDialog
- [转].NET Core、Xamarin、.NET Standard和.NET Framework四者之间的区别
- SQL Server如何查找表名或列名中包含空格的表和列
- 记一次ssh配置的锅
- python:数据类型list
- W3School 学习笔记
- Shader的基本用法和语法结构
- Java项目(5)——单例模式的应用与研究
热门文章
- Django---Django返回用户输入数据
- Java中的实体类--Serializable接口、transient 关键字
- PAT 基础编程题目集 6-7 统计某类完全平方数 (20 分)
- BDA3 Chapter 1 Probability and inference
- mysql错误:Column count doesn&#39;t match value count at row 1解决办法
- H5_0018:z-index失效的原因
- 统一身份认证服务IdentityServer4实践
- 在vue项目中设置BASE_URL
- Codeforces Round #619 (Div. 2) A~D题解
- 三行代码实现垂直居中和cube