The Necklace UVA - 10054(欧拉回路)
题目分析: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(欧拉回路)的更多相关文章
- UVA 10054 (欧拉回路) The Necklace
题目:这里 题意:有一种由彩色珠子连接而成的项链,每个珠子两半由不同颜色(由1到50的数字表示颜色)组成,相邻的两个珠子在接触的地方颜色相同,现在有一些零碎的珠子,确认它是否能 复原成完整的项链. 把 ...
- Uva 10054 欧拉回路 打印路径
看是否有欧拉回路 有的话打印路径 欧拉回路存在的条件: 如果是有向图的话 1.底图必须是连通图 2.最多有两个点的入度不等于出度 且一个点的入度=出度+1 一个点的入度=出度-1 如果是无向图的话 1 ...
- UVA 10054 The Necklace(欧拉回路,打印路径)
题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- uva 10054 The Necklace(欧拉回路)
The Necklace My little sister had a beautiful necklace made of colorful beads. Two successive beads ...
- UVa 10054 The Necklace(无向图欧拉回路)
My little sister had a beautiful necklace made of colorful beads. Two successive beads in the neckla ...
- UVA 10054 the necklace 欧拉回路
有n个珠子,每颗珠子有左右两边两种颜色,颜色有1~50种,问你能不能把这些珠子按照相接的地方颜色相同串成一个环. 可以认为有50个点,用n条边它们相连,问你能不能找出包含所有边的欧拉回路 首先判断是否 ...
- UVa 10054 (打印欧拉回路) The Necklace
将每个颜色看成一个顶点,对于每个珠子在两个颜色之间连一条无向边,然后求欧拉回路. #include <cstdio> #include <cstring> + ; int G[ ...
- uva 10054 The Necklace 拼项链 欧拉回路基础应用
昨天做了道水题,今天这题是比较水的应用. 给出n个项链的珠子,珠子的两端有两种颜色,项链上相邻的珠子要颜色匹配,判断能不能拼凑成一天项链. 是挺水的,但是一开始我把整个项链看成一个点,然后用dfs去找 ...
- UVa 10054 The Necklace【欧拉回路】
题意:给出n个珠子,珠子颜色分为两半,分别用1到50之间的数字表示, 现在给出n个珠子分别的颜色,问是否能够串成一个环.即为首尾相连,成为一个回路 判断是否构成一个环,即判断是否为欧拉回路,只需要判断 ...
随机推荐
- Nginx入门篇(三)之虚拟主机配置
一.虚拟主机概念 所谓虚拟主机,在Web服务当中就是一个独立的网站站点,这个站点对应独立的域名(也有可能是IP或者端口),具有独立的程序和资源目录,可以独立地对外提供服务供用户访问. 这个独立的站点在 ...
- log4j 注意事项
因为项目是 ssm+maven 所以有关log4j的注意事项记录一下 首先,需要在web.xml里配置spring的拦截器用于支持在项目下生成log4j日志文件 <!-- 配置log4j输出日志 ...
- 【转】bash: ssh: command not found解决方法(linux)
原文转自:http://www.cnblogs.com/ahauzyy/archive/2013/04/25/3043699.html 今天在搭建hadoop的开发环境中,用的是centsos6.0的 ...
- Oracle dba权限下修改用户密码 授予用户权限 解锁用户
1.修改用户密码 alter user scott identified by 123 2.授予用户权限 grant connect,resource to scott 3.解锁用户 alter us ...
- Eclipse各个版本
Eclipse最初是由IBM公司开发的替代商业软件Visual Age for Java的下一代IDE开发环境,2001年11月贡献给开源社区,现在它由非营利软件供应商联盟Eclipse基金会. Ec ...
- Wince 中访问WCF服务
由于本文并非WinCE开发普及篇,所以一些WinCE开发和WCF开发的基础还请移步百度和谷歌寻找答案,然后结合本文开发出WinCE中如何访问WCF,谢谢. 开发环境 IDE:Visual Studio ...
- java 中的字符串
创建String对象 String s1="xxx"://创建一个字符串对象“xxx”,名为s1; String s2=new String();//创建一个空字符串对象,名为S2 ...
- 使用Photon引擎进行unity网络游戏开发(一)——Photon引擎简介
使用Photon引擎进行unity网络游戏开发(一)--Photon引擎简介 Photon PUN Unity 网络游戏开发 Photon引擎简介: 1. 服务器引擎: 服 务 器 引 擎 介 绍 服 ...
- python终端计算器,还有没其他方法?
import sysdef lt(a, b, c ): if b == "+": return int(a)+int(c) elif b == "-": ret ...
- fetch上传文件报错的问题(multipart: NextPart: EOF)
技术栈 后台: gin(golang) 前端: react+antd+dva 问题 前端这边使用fetch发送http请求的时候,后端解析formData报错: multipart: NextPart ...