题目分析:1.无向图欧拉回路是否连通2.所有点的度为偶数。并查集+degree

这题题目保证了是联通的  所以就不用判断是否联通了

#include <iostream>
#include <cstdio>
#include <sstream>
#include <cstring>
#include <map>
#include <set>
#include <vector>
#include <stack>
#include <queue>
#include <algorithm>
#include <cmath>
#define rap(a, n) for(int i=a; i<=n; i++)
#define MOD 2018
#define LL long long
#define ULL unsigned long long
#define Pair pair<int, int>
#define mem(a, b) memset(a, b, sizeof(a))
#define _ ios_base::sync_with_stdio(0),cin.tie(0)
//freopen("1.txt", "r", stdin);
using namespace std;
const int maxn = , INF = 0x7fffffff;
int n;
int drgee[maxn], f[maxn], line[maxn][maxn];
//int find(int x)
//{
// return f[x]==x?x:(f[x]=find(f[x]));
//} void print(int u)
{
for(int i=; i<=; i++)
if(line[u][i])
{
line[u][i]--;
line[i][u]--;
print(i);
printf("%d %d\n", i, u);
} } int main()
{
int T, cnt, kase = ;
scanf("%d", &T);
while(T--)
{
cnt = ;
mem(drgee, );
mem(line, );
// rap(1, maxn-1) f[i] = i;
scanf("%d", &n);
rap(, n)
{
int u, v;
scanf("%d%d", &u, &v);
drgee[u]++;
drgee[v]++;
line[u][v]++;
line[v][u]++;
// f[u] = v;
}
printf("Case #%d\n", ++kase);
// rap(1, n)
// {
// if(f[i] == i)
// {
// cnt++;
// break;
// }
// } // if(cnt > 1)
// {
// cout<< "some beads may be lost" <<endl;
// if(T) printf("\n");
// continue;
// }
cnt = ;
rap(, )
{
if(drgee[i] & )
{
cnt++;
break;
}
}
if(cnt > )
{
printf("some beads may be lost\n");
if(T) printf("\n");
continue;
}
rap(, )
{
print(i);
} if(T) printf("\n");
} return ;
}

以下解释 转载至 https://www.cnblogs.com/scau20110726/archive/2012/11/09/2762371.html  文章 和 评论部分

如果写成这样是错的

void euler(int u)
{
int v;
for(v=1; v<=50; v++)
if(g[u][v])
{
g[u][v]--;
g[v][u]--;
       printf("%d %d\n",u,v);

        euler(v);
    //这样相当于顺序输出
}
}

在输入的时候使会有重边的,也就是g[i][j]的值不一定只是为1

然后从一个点出发,找到和他相连的点,然后删除这条无向边,所以是  g[u][v]--;   g[v][u]--;  然后就去dfs下一个点v,最后在递归返回的时候才输出路径,也就是逆序输出,为什么要逆序输出了

因为和当前点i相连的点可能不止一个

例如当前点是1,上一条边是(3,1) . 而和1相连的点有2,7,11,能分成3个方向

往2的方向有:(1,2) (2,4)

往7的方向有:(1,7)(7,5)(5,6)

往11的方向有:(1,11)(11,12)(12,13)

如果顺序输出将会是

3 1

1 2

2 4

1 7

7 5

5 6

1 11

11 12

12 13

当找到起点之后,将起点压入栈中,然后访问与顶点相连的一个顶点,将该顶点压入栈中,同时删除这条边,然后继续DFS寻找顶点,并同样压栈、删除,最后,直到走到一个没有任何边与它相连的顶点(可能是起始点,也可能不是),便开始进行回溯,(回溯的同时进行弹栈,弹栈的结果也就是欧拉回路的逆序输出结果),回溯的过程就是寻找相连路径的过程,如果回溯的过程中发现仍然有边与当前顶点相连,那么继续从这个顶点沿着未删除的边去DFS,同时进行压栈等一系列操作,最后,必定会回到该点,然后继续回溯,直到顶点,逆序输出,结束

顺序输出如果要得到正确答案,则必须保证dfs不会回溯,即一条直线深入,到直线的最后全部边已经都访问完了。
假设要搜索的路径是:1->2->1,这种时候顺序输出是没有问题的,因为它只有一条路径的选择。
但如果在路径中间再加一个小环(对欧拉回路并不影响),变成这样:
1->2->(3->2)->1,这个时候就有可能要回溯了,如果顺序输出,结果可能会变成:
1 2
2 1
2 3(开始回溯)
3 2

当然顺序输出也有一定的几率会正确,但不能得到保证:
1 2
2 3(先搜索小环)
3 2(结束小环,回到正轨)
2 1

而逆序输出是在弹栈的时候输出的,任意的搜索顺序下都可以确保小环在主线内容全部输出完之前得到输出的机会。

The Necklace UVA - 10054(欧拉回路)的更多相关文章

  1. UVA 10054 (欧拉回路) The Necklace

    题目:这里 题意:有一种由彩色珠子连接而成的项链,每个珠子两半由不同颜色(由1到50的数字表示颜色)组成,相邻的两个珠子在接触的地方颜色相同,现在有一些零碎的珠子,确认它是否能 复原成完整的项链. 把 ...

  2. Uva 10054 欧拉回路 打印路径

    看是否有欧拉回路 有的话打印路径 欧拉回路存在的条件: 如果是有向图的话 1.底图必须是连通图 2.最多有两个点的入度不等于出度 且一个点的入度=出度+1 一个点的入度=出度-1 如果是无向图的话 1 ...

  3. UVA 10054 The Necklace(欧拉回路,打印路径)

    题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  4. uva 10054 The Necklace(欧拉回路)

    The Necklace  My little sister had a beautiful necklace made of colorful beads. Two successive beads ...

  5. UVa 10054 The Necklace(无向图欧拉回路)

    My little sister had a beautiful necklace made of colorful beads. Two successive beads in the neckla ...

  6. UVA 10054 the necklace 欧拉回路

    有n个珠子,每颗珠子有左右两边两种颜色,颜色有1~50种,问你能不能把这些珠子按照相接的地方颜色相同串成一个环. 可以认为有50个点,用n条边它们相连,问你能不能找出包含所有边的欧拉回路 首先判断是否 ...

  7. UVa 10054 (打印欧拉回路) The Necklace

    将每个颜色看成一个顶点,对于每个珠子在两个颜色之间连一条无向边,然后求欧拉回路. #include <cstdio> #include <cstring> + ; int G[ ...

  8. uva 10054 The Necklace 拼项链 欧拉回路基础应用

    昨天做了道水题,今天这题是比较水的应用. 给出n个项链的珠子,珠子的两端有两种颜色,项链上相邻的珠子要颜色匹配,判断能不能拼凑成一天项链. 是挺水的,但是一开始我把整个项链看成一个点,然后用dfs去找 ...

  9. UVa 10054 The Necklace【欧拉回路】

    题意:给出n个珠子,珠子颜色分为两半,分别用1到50之间的数字表示, 现在给出n个珠子分别的颜色,问是否能够串成一个环.即为首尾相连,成为一个回路 判断是否构成一个环,即判断是否为欧拉回路,只需要判断 ...

随机推荐

  1. day 12 列表字典 补充

    1.列表list的遍历 ##### while遍历 需要len(list) list = [11,22,33,44,55] len_list = len(list) i = 0 while i< ...

  2. Android:制作聊天气泡点9图

    步骤一:选择res下的一张图片,右击选择“Create 9-Patch File” 步骤二:确定点9图的名字,只能修改.9.png之前的信息 步骤三:在同目录下会生成刚才创建的点9图,双击打开进行编辑 ...

  3. 可能是全网首个支持阿里云Elasticsearch Xapck鉴权的Skywalking

    可能是全网首个支持阿里云Elasticsearch Xapck鉴权的Skywalking 对Skywalking有兴趣的同学参见:年轻人的第一个APM-Skywalking 之前在搭建Skywalki ...

  4. 提取oracle awr报告

    做性能测试时有时需要分析sql的执行情况,以找出需要优化的sql,oracle数据库就提供了很好的数据库状态和sql执行情况的监控平台,数据库的监控平台可以时时的监控数据库的状态,同时还可以取监控的时 ...

  5. C# VS,连接到oracle 报要升级到8.多少版本的错

    1:确定服务器的oracle版本 2:本地的客户端版本要和服务器一致 3:操作系统位数要一致

  6. Spring学习(十二)-----Spring @PostConstruct和@PreDestroy实例

    实现 初始化方法和销毁方法3种方式: 实现标识接口 InitializingBean,DisposableBean(不推荐使用,耦合性太高) 设置bean属性 Init-method destroy- ...

  7. 牛客小白月赛9H论如何出一道水题(两个连续自然数互质)

    题面 记录一下...连续得两个自然数互质,这题再特判一下1的情况 #include<bits/stdc++.h> using namespace std; int main() { lon ...

  8. SpringBoot (1) idea下的环境搭建及demo

    1.Spring Boot简介 wiki上的介绍: Spring Boot是Spring的常规配置解决方案,用于创建可以“运行”的独立的,生产级的基于Spring的应用程序.[22]它预先配置了Spr ...

  9. 原生js使用ajax

    AJAX 可以在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页内容(默认是异步) (1)使用ajax会用到XMLHttpRequest()对象 (2)然后使用open方法定义请求方法和请求 ...

  10. jvm之GC知识点

    GCRoots:        虚拟机栈(栈帧中的局部变量表)引用的对象       方法区中静态属性引用的对象       方法去中常量引用的对象       本地方法栈中JNI(NATIVE方法) ...