UVA 11054 The Necklace 转化成欧拉回路

题意比较简单,给你n个项链碎片,每个碎片的两半各有一种颜色,最后要把这n个碎片串成一个项链,要求就是相邻碎片必须是同种颜色挨着。

看了下碎片总共有1000个,颜色有50种,瞬间觉得普通方法是无法在可控时间内做出来的,因为碎片到底放哪里以及是正着放还是反着放都是不可控的。

这个时候数学建模就真的好重要了,如果我们能把颜色作为节点,一个碎片就表示两个节点连了一条路,那其实就是走了一遍欧拉回路,就意味着项链做成了。

太叼了,这个思想真心不错。。。LRJ书上的提示,否则我还真是想不到可以这样。

不过还有个问题就是,欧拉回路用的DFS,按题目这个数据规模应该是会TLE的。

写上一句的时候突然灵感了一下,普通DFS是 状态^层数 为复杂度,这个看似层数特别多
假设有n条边,就应该要递归n层,就有50^n,,,但其实错了,欧拉回路走完所有的路就终止了,所以越到下面可选状态越少,最终还是最多1000个状态就可以了(即总路径条数)这也是为什么这个DFS不会TLE


#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int mat[55][55];
int deep[55];
void init()
{
memset(mat,0,sizeof mat);
memset(deep,0,sizeof deep);
}
void euler(int u)
{
for (int i=1;i<=50;i++){
while (mat[u][i]){ //可能有多个同样的碎片,意味着两个节点有多条边
mat[u][i]--;
mat[i][u]--;
euler(i);
printf("%d %d\n",i,u);//dfs是反过来的,因此把孩子输出在前面,使得回路正确
}
}
}
int main()
{
int t,n,a,b,kase=0;
scanf("%d",&t);
while (t--){
init();
scanf("%d",&n);
for (int i=0;i<n;i++){
scanf("%d%d",&a,&b);
deep[a]++;deep[b]++;
mat[a][b]++;mat[b][a]++;
}
printf("Case #%d\n",++kase);
bool flag=0;
for (int i=1;i<=50;i++){
if (deep[i]%2==1){flag=1;break;}
}
if (flag){
puts("some beads may be lost");
if (t) puts("");
continue;
}
int u=1;
while (deep[u]==0) u++;
euler(u);
if (t) puts("");
}
return 0;
}

UVA 11054 The Necklace 转化成欧拉回路,布布扣,bubuko.com

时间: 2024-10-31 04:05:16

UVA 11054 The Necklace 转化成欧拉回路的相关文章

UVA 10054 The Necklace (无向图的欧拉回路)

题意: 妹妹有一条项链,这条项链由许多珠子串在一起组成,珠子是彩色的,两个连续的珠子的交汇点颜色相同,也就是对于相邻的两个珠子来说,前一个珠子的末端颜色和后一个珠子的首端颜色相同.有一天,项链断了,珠子洒落了一地,到处都是,妹妹使出浑身解数把地板上能看到的珠子(5-1000)都捡了起来,但是不确定是否收集齐了.给你他妹妹收集的珠子的两端的颜色编号(1 - 50),让你判断是否收集齐了. 思路: 把颜色看成点,把一个珠子看成一个无向边,则问题有解,当且仅当图中存在欧拉回路.于是先判断由题意构建出来

UVA - 10054 - The Necklace (欧拉回路!!)

UVA - 10054 The Necklace Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description  Problem D: The Necklace  My little sister had a beautiful necklace made of colorful beads. Two successive beads in the neckl

uva 10054 The Necklace 欧拉回路

// uva 10054 The Necklace 欧拉回路 // 以颜色为节点,两种颜色互相连着有向边,然后跑一边欧拉回路就ok了 // 这题套了余老师模板书上的欧拉回路,然后就过了 // // 通过这题我了解到了,欧拉回路的基本思想 // 哎,继续练吧... #include <algorithm> #include <bitset> #include <cassert> #include <cctype> #include <cfloat>

iOS开发之---将时间戳,转化成时间字符串。

1.将一个NSDate,转化成时间字符串. NSDate *date = [NSDate date]; NSDateFormatter *fmt = [[NSDateFormatter alloc] init]; fmt.dateFormat = @"yyyy-MM-dd"; NSString *dateStr = [fmt stringFromDate:date];

将华氏温度转换成摄氏温度或将摄氏温度转化成华氏温度。(需考虑多种不合法的情况尽量转化为合法的)

//华氏温度与摄氏温度转换,编写一个程序,将华氏温度转换成摄氏温度或将摄氏温度转化成华氏温度. //要求程序运行时从控制台读入温度值及单位,并输出另一种温度值及单位,例如:若用户输入27 C则 //程序输出 81F:若用户输入96 F,则程序输出36 C(其中C代表摄氏温度,F代表华氏温度),华氏温度与摄氏温度转化的公式为: //C = 5 (F - 32) / 9 //F = 9 C / 5 + 32 //要求输入的温度值是整数,输出的温度值也是四舍五入后的整数. package 第三天_练习

JSON数据转化成模型

JSON数据转化成模型 // 1.创建url NSURL *url = kSUNUrl(@"video"); // 2.创建request NSURLRequest *request = [NSURLRequest requestWithURL:url]; // 3.发送请求数据 NSOperationQueue *queue = [NSOperationQueue mainQueue]; [NSURLConnection sendAsynchronousRequest:request

(白书训练计划)UVa 11054 Wine trading in Gergovia(等价转换)

题目地址:UVa 11054 很巧妙的一道题,这题是利用的等价转换,对每一条路来说,假如右边生产的比左边的多x,那么不管起点是哪,终点是哪,都可以把左右两侧的看成两个点,要从这条路上运送x个劳动力.再由于总和是0,所以只需要算出一端的总和就可以,这样只要遍历一遍就可以算出来了.写出代码就很简单了... 代码如下: #include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.

如何将别人的知识转化成自己的知识?

不传授具体的知识,只告诉你获得知识的方法.将别人的知识转化成自己的知识,成就你的丰盈人生! 由知识管理中心(Knowledge Management Center)基于最新知识管理理论和实践.认知与学习理论,结合互联网对于信息和知识整合.传播.创造的影响所开发的"KMC高效学习方法网络课程"已经在众多同学学习的基础上.结合多位专家的建议进行了重大升级. [课程名称]KMC 高效学习方法网络课程–互联网思维下的高效学习方法 [课程导师]田志刚 知名知识管理专家.个人知识管理畅销书<

laravel 将数组转化成字符串 再把字符串转化成数组

这是在给阮少翔改代码的时候用的方法, 开始的数据用explored转化成数组不是想要的结果, 我就自己写了一个方法把有用的信息提取出来拼接成一个字符串, 再用explored将字符串转化成数组.   方法有点笨, 但是最后是解决了阮少翔的问题 $re1 = DB::table('admin_user') ->join('admin_role_user','admin_user.id','=','admin_role_user.user_id') ->select('admin_role_use