题解【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 ...
随机推荐
- git提交时忽略了dll
问题说明 突然出现torisegit会自动忽略*.dll文件不会提交,比如:CSharp.dll. 问题原因 原因是由于安装了Sourcetree,受到了其环境变量的影响. Windows系统 ...
- Gerrit评审代码流程注意事项
Gerrit管理CR流程时要注意下面两大事项: (一)格式规范 这部分主要是根据公司或者团队的要求规范来撰写格式,这里不做统一介绍了:格式规范的宗旨是让修改的代码和业务需求能够匹配.可追溯. (二)评 ...
- svn error: "Previous operation has not finished; run 'cleanup' if it was interrupted"
出现这种问题,有几个原因 1.本身文件确实是锁住了 2.之前clean up 过很多次,但是每次都可能以失败告终,造成work queue存在缓存队列 3.svn lock 有lock记录 以下是简单 ...
- 牛客寒假6-C汉诺塔
链接:https://ac.nowcoder.com/acm/contest/3007/C来源:牛客网 题目描述 现在你有 N 块矩形木板,第 i 块木板的尺寸是 Xi*Yi,你想用这些木板来玩汉诺塔 ...
- MySQL必会的50个常见面试练习题
下面的SQL题目都是比较基础,比较常见的数据库SQL面试题,在技术面试环节虽然碰到相同题目的机会比较少,但解题的基本思路都是差 不多的.下面是SQL面试题描述: Student(Sid,Sname,S ...
- php实现简易留言板效果
首先是Index页面效果图 index.php <?php header('content-type:text/html;charset=utf-8'); date_default_timezo ...
- mui 时间选择器和上传图片
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <meta name= ...
- ORACLE不常用但实用的技巧- 树查询 level用法
树查询 使用树查询的前提条件是: 在一条记录中记录了当前节点的ID和这个节点的父ID. 注意:一旦数据中出现了循环记录,如两个节点互为对方的父结点,系统就会报 ORA-01436错误(ORA-0143 ...
- shell循环结构解析:for/while/case
1.for循环结构 for var in item1 item2 ... itemN do command1 command2 ... commandN done 例如,顺序输出当前列表中的数字: # ...
- K3/Cloud 执行计划任务错误排查
计划任务的不执行原因可能有: 1.K3CloudJobProcess服务处于停止状态. 2.数据中心未勾选“允许执行计划任务”. 这种情况此数据中心下的所有计划任务都不会执行到. 3.第一次加进计划任 ...