题目分析: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. Q&As:1.cocos2d-html5如何获得鼠标划过事件

    不喜欢按部就班学东西,感觉各种框架各种技术就应该是拿到手用的,这应该是导致我现在学了这么多却没一样精通的缘故吧. 发现自己喜欢在QQ群回答一些菜鸟的问题,就算自己不清楚也会乐意看代码帮助解决╮(╯_╰ ...

  2. Mac下重置MySQL密码

    第一步要先停止掉mysql服务: brew services stop mysql 第二步查看mysql安装路径: brew info mysql //我这里是brew管理的所以我用brew查看mys ...

  3. python全栈开发-面向对象-进阶

    python_day_18 1,面向对象的三大特性是什么?继承,多态,封装2,什么是面向对象的新式类?什么是经典类?凡是继承object类都是新式类.凡是不继承object类都是经典类.3,面向对象为 ...

  4. python-python爬取妹子图片

    # -*- conding=utf-8 -*- import requests from bs4 import BeautifulSoup import io url = "https:// ...

  5. 在Office 365 的如何给管理员赋予查看所有人邮箱的权限的Powershell

    连接至Office365 的Powershell Get-MsolUser -UserPrincipalName admin@***.partner.onmschina.cn //Get-MsolUs ...

  6. javascript提高篇

    本章简介 本章内容比较少,有三个分享的知识.你可能都看过了,因为网上也有很多提问和解答,如果没看过或者没搞懂,你可以再看看这篇文章. 1. 数组去重方法的演变    --  走向代码缩短化 2. [] ...

  7. 作业要求20181016-3 Alpha阶段第1周/共2周 Scrum立会报告+燃尽图 01

    此次作业要求参见https://edu.cnblogs.com/campus/nenu/2018fall/homework/2246 Scrum master:范洪达 一.小组介绍 组长:王一可 组员 ...

  8. PHP 函数总结

    感觉对函数了解的不够深,从头到尾梳理一遍(更新中....) 1,class_exists(),interface_exists(),method_exists(),get_class(),get_pa ...

  9. OpenFlow协议

    功能 1.0版本Openflow:控制器通过Openflow协议与交换机建立了安全通道(Sceure Channel),下发流表. 1.3版本Openflow:多控制器,多流表. 用于实现Contro ...

  10. HDU 1257 最少拦截系统(最长递减子序列的条数)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1257 题解: #include<iostream> #include<cstdio ...