题解【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 ...
随机推荐
- scp 后台执行(防止大文件关闭会话丢失)
Linux scp 设置nohup后台运行 Linux scp 设置nohup后台运行 1.正常执行scp命令 2.输入ctrl + z 暂停任务 3.bg将其放入后台 1.正常执行scp命令 从or ...
- 畅通工程 HDU - 1232 并查集板子题
#include<iostream> #include<cstring> using namespace std; ; int p[N]; int find(int x) { ...
- Android View框架的draw机制
概述 Android中View框架的工作机制中,主要有三个过程: 1.View树的测量(measure) Android View框架的measure机制 2.View树的布局(layout)Andr ...
- 137.在Django中操作session
在Django中操作session 在django中session默认情况下是存储在服务器的数据库中的,在表中会根据sessionid来提取指定的session数据,然后再把这个sessionid放到 ...
- 获取redis cluster master对应的slot分布情况
需求:原生的redis-trib.rb功能是强大,但输出的内容过于繁杂,比如我需要关注哪些master对应哪些slots,不是很直观,如果集群的规模更大的话,那么输出的结果获取信息更加困难. 说明:这 ...
- java exec python program
I find three methods, the first is using jython, the module of jython can transform the type of data ...
- [Python]pyhon去除txt文件重复行 python 2020.2.10
代码如下: import shutil readPath='E:/word4.txt' #要处理的文件 writePath='E:/word5.txt' #要写入的文件 lines_seen=set( ...
- usim卡介绍
- hzq84621巨佬的语录
摘自诸中培训讲图论时: 1.光图论考不出什么东西,一般作为DP的附庸出现. 2.如果不是骗骗不承认SPFA的外国人,一般能用dij就用dij. 3.那个东西(指bellman-ford)除了判负环没什 ...
- iloc与loc的区别
pandas.DataFrame.iloc iloc基于位置进行索引,主要是整数位置,也可以用布尔数组 iloc的输入可以是:单个整数.整数列表或数组.整数切片.布尔数组 pandas.DataFr ...