题解【UVA10054】The Necklace
题目描述

输入格式

输出格式

题意简述
有一种由彩色珠子连接而成的项链。每个珠子的两半由不同颜色组成。如图所示,相邻两个珠子在接触的地方颜色相同。现在有一些零碎的珠子,需要确认它们是否可以复原成完整的项链。
输入格式:
输入第一行为测试数据组数 \(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;//结束
}
题解【UVA10054】The Necklace的更多相关文章
- [题解]UVA10054 The Necklace
链接:http://vjudge.net/problem/viewProblem.action?id=18806 描述:给出一堆珠子,每个珠子有两种颜色,有一端颜色相同的珠子可以串在一起,问是否可以把 ...
- UVA10054 The Necklace
UVA10054 The Necklace 链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18806 [思路] 欧拉回路 ...
- UVA-10054.The Necklace(欧拉回路)解题报告
2019-02-09-21:55:23 原题链接 题目描述: 给定一串珠子的颜色对,每颗珠子的两端分别有颜色(用1 - 50 之间的数字表示,对每颗珠子的颜色无特殊要求),若两颗珠子的连接处为同种颜色 ...
- UVA-10054 The Necklace (欧拉回路)
题目大意:有n个珠子,珠子两边的颜色已知,问能否连成一条项链.(两个珠子可以项链当且仅当一个珠子的一边颜色与另一个珠子的另一边颜色相同). 题目分析:欧拉回路.将颜色视作节点,珠子当做边,问题变成了找 ...
- [数据生成器]UVA10054 The Necklace
应吴老师之邀,写了个数据生成器. 目前这个数据生成器可以保证生成的数据都是合法的,且效率也还不错.只是在建立普通连通图的时候zyy偷懒了,直接把所有点串起来从而保证图的连通.如果有大神有更好的方法请不 ...
- 题解 P1203 【[USACO1.1]坏掉的项链Broken Necklace】
[USACO1.1]坏掉的项链Broken Necklace 22892 破碎的项链 方法一:很容易想到枚举断点,再分别两头找,但是要注意很多细节 #include<iostream> # ...
- 【dog与lxy】8.25题解-necklace
necklace 题目描述 可怜的dog最终还是难逃厄运,被迫于lxy签下城下之约.这时候lxy开始刁难dog. Lxy首先向dog炫耀起了自己的财富,他拿出了一段很长的项链.这个项链由n个珠子按顺序 ...
- 「日常训练」The Necklace(UVA-10054)
代码 for(int i=0; i!=n; ++i) { int u = cin.nextInt(); int v = cin.nextInt(); edges.add(new Edge(u,v)); ...
- 2016 Multi-University Training Contest 1 H.Shell Necklace
Shell Necklace Time Limit: 16000/8000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
随机推荐
- Spark学习之路 (十九)SparkSQL的自定义函数UDF[转]
在Spark中,也支持Hive中的自定义函数.自定义函数大致可以分为三种: UDF(User-Defined-Function),即最基本的自定义函数,类似to_char,to_date等 UDAF( ...
- webkit 技术内幕 笔记 三
浏览器内核及特性 在浏览器中,一个很重要的模块,是将页面转变成可视化的图像结果,这就是浏览器的内核,通常被称作渲染引擎.渲染:就是根据描述或者定义构建数学模型,通过模型生成图像的过程.浏览器的渲染引擎 ...
- Parity game POJ - 1733 带权并查集
#include<iostream> #include<algorithm> #include<cstdio> using namespace std; <& ...
- 问题 C: 查找
#include <cstdio> #include <vector> #include <algorithm> using namespace std; bool ...
- eXosip和osip详解
文档 可以查看exosip osip的在线文档 http://www.antisip.com/doc/ 在线文档 一般先看mainpage 会有库的一个整体说明. 其次看看 modules 会有一些使 ...
- Java知识点题集
一.红黑树的特性 (1)每个节点或者是黑色,或者是红色. (2)根节点是黑色. (3)每个叶子节点(NIL)是黑色. [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!] (4)如果一个节 ...
- java学习笔记之反射—Class类实例化和对象的反射实例化
反射之中所有的核心操作都是通过Class类对象展开的,可以说Class类是反射操作的根源所在,但是这个类的实例化对象,可以采用三种方式完成. java.lang.Class类的定义: public f ...
- python3.6安装lxml库
好像是在python3.5之后,安装了lxml也无法使用etree 为了就解决这个问题使用如下方法: 1.下载lxml的wheel文件,下载地址:https://www.lfd.uci.edu/~go ...
- cf 手机短信问题
题目链接:https://vjudge.net/contest/331120#problem/C 题目:你有一部手机,最多显示k个人发的信息,现在收到n条信息,有可能人是相同的人发的.最新的要顶置,当 ...
- Codeforce 230A - Dragons (sort)
Kirito is stuck on a level of the MMORPG he is playing now. To move on in the game, he's got to defe ...