UOJ117 欧拉回路[欧拉回路]
找欧拉回路的模板题。
知识点详见图连通性学习笔记。
注意一些写法上的问题。
- line37&line61:因为引用,所以j和head值是同步更新的,类似于网络流的当前弧优化,除了优化枚举外,这样还有一个好处就是这个点所有边遍历完退回的时候,j直接就是和head一样是0,避免退回的时候枚举边,但是要注意保存原j值为tmp。。。
- 一些特殊数据:
- 图只有一个连通块,但有些点是孤立点。根据题意,这是可能的,所以要找到第一个有度数的点(表示在连通块里)开始dfs
- 但是若干个块不连通的话就不行了,所以有line47判断。(不过这个判断还可以判一个连通块存不存在解)
- 还有全是孤立点的情况也特判掉
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define mst(x) memset(x,0,sizeof x)
#define dbg(x) cerr << #x << " = " << x <<endl
#define dbg2(x,y) cerr<< #x <<" = "<< x <<" "<< #y <<" = "<< y <<endl
using namespace std;
typedef long long ll;
typedef double db;
typedef pair<int,int> pii;
template<typename T>inline T _min(T A,T B){return A<B?A:B;}
template<typename T>inline T _max(T A,T B){return A>B?A:B;}
template<typename T>inline char MIN(T&A,T B){return A>B?(A=B,):;}
template<typename T>inline char MAX(T&A,T B){return A<B?(A=B,):;}
template<typename T>inline void _swap(T&A,T&B){A^=B^=A^=B;}
template<typename T>inline T read(T&x){
x=;int f=;char c;while(!isdigit(c=getchar()))if(c=='-')f=;
while(isdigit(c))x=x*+(c&),c=getchar();return f?x=-x:x;
}
const int N=4e5+;
int opt,n,m;
namespace task1{
int head[N],nxt[N],to[N],tot=;
inline void add(int x,int y){
to[++tot]=y,nxt[tot]=head[x],head[x]=tot;
to[++tot]=x,nxt[tot]=head[y],head[y]=tot;
}
#define y to[j]
int deg[N],vis[N],stk[N],top;
void dfs(int x){
for(register int&j=head[x],tmp;j;j=nxt[j])if(!vis[j]){//dbg(j);
vis[j]=vis[j^]=,tmp=j;
dfs(y);//因为引用,所以j和head值是同步更新的,注意保存原j值...
stk[++top]=tmp&?-(tmp>>):(tmp>>);
}
}
#undef y
inline void solve(){
for(register int i=,x,y;i<=m;++i)read(x),read(y),add(x,y),++deg[x],++deg[y];
for(register int i=;i<=n;++i)if(deg[i]&){puts("NO");return;}
int st;for(st=;!deg[st];++st);
if(st>n){puts("YES");return;}
dfs(st);
if(top<m){puts("NO");return;}
puts("YES");
while(top)printf("%d%c",stk[top]," \n"[top==]),--top;
}
}
namespace task2{
int head[N],nxt[N],to[N],tot=;
inline void add(int x,int y){to[++tot]=y,nxt[tot]=head[x],head[x]=tot;}
int ind[N],outd[N],vis[N],stk[N],top;
#define y to[j]
void dfs(int x){
for(register int&j=head[x],tmp;j;j=nxt[j])if(!vis[j]){
vis[j]=,tmp=j;
dfs(y);
stk[++top]=tmp;
}
}
#undef y
inline void solve(){
for(register int i=,x,y;i<=m;++i)read(x),read(y),add(x,y),++outd[x],++ind[y];
for(register int i=;i<=n;++i)if(ind[i]^outd[i]){puts("NO");return;}
int st;for(st=;!outd[st];++st);
if(st>n){puts("YES");return;}
dfs(st);
if(top<m){puts("NO");return;}
puts("YES");
while(top)printf("%d%c",stk[top]," \n"[top==]),--top;
}
} int main(){//freopen("test.in","r",stdin);//freopen("test.ans","w",stdout);
read(opt),read(n),read(m);
if(opt==)task1::solve();
else task2::solve();
return ;
}
UOJ117 欧拉回路[欧拉回路]的更多相关文章
- UOJ117:欧拉回路——题解
http://uoj.ac/problem/117 (作为一道欧拉回路的板子题,他成功的令我学会了欧拉回路) (然而我不会背……) 就两件事: 1.无向图为欧拉图,当且仅当为连通图且所有顶点的度为偶数 ...
- 【UOJ117】 欧拉回路(欧拉回路)
传送门 UOJ Solution 无解 t=1,无向图,当且仅当\(\exists i \ \ in_i \ne out_i\) t=2,有向图,当且仅当\(\exists i \ \ in_i是奇数 ...
- HDU-1878 欧拉回路 欧拉回路
题目链接:https://cn.vjudge.net/problem/HDU-1878 题意 中文题,而且就是单纯的欧拉回路 思路 判断连通图 用并查集会很好,bfs亦可 一时脑抽用bfs过了这个题, ...
- K - 欧拉回路(并查集)
点击打开链接 K - 欧拉回路 欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路.现给定一个图,问是否存在欧拉回路? Input 测试输入包含若干测试用例.每个测试用例的第 ...
- ACM3018欧拉回路
欧拉回路 欧拉回路:图G,若存在一条路,经过G中每条边有且仅有一次,称这条路为欧拉路,如果存在一条回路经过G每条边有且仅有一次, 称这条回路为欧拉回路.具有欧拉回路的图成为欧拉图. 判断欧拉路是否存在 ...
- POJ2513 Colored Sticks(Trie+欧拉回路)
Description You are given a bunch of wooden sticks. Each endpoint of each stick is colored with some ...
- UOJ117. 欧拉回路【欧拉回路模板题】
LINK 题目大意 就是让你对有向图和无向图分别求欧拉回路 非常的模板,但是由于UOJ上毒瘤群众太多了 所以你必须加上一个小优化 就是每次访问过一个边就把它删掉 有点像Dinic的当前弧优化的感觉 注 ...
- 欧拉回路 uoj117
写了一道欧拉回路的模板题.先判断是否是欧拉回路,有向图和无向图有一点点不同,然后就是特判独立点的存在. 之后是输出路径,和dls学的dfs,利用last数组的更新可以做到线性的复杂度,否则一不小心就会 ...
- uoj117 欧拉回路
题目描述: 有一天一位灵魂画师画了一张图,现在要你找出欧拉回路,即在图中找一个环使得每条边都在环上出现恰好一次. 一共两个子任务: 这张图是无向图.(50 分) 这张图是有向图.(50 分) 输入格式 ...
随机推荐
- macos 更改罗技k810无线键盘的映射
在mac系统中,command键非常关键,但k810接入后, win键被映射为Command,而Alt的位置却是mac内置键盘的Command的位置. 为方便使用,可以把Win键和Alt键做一个对换. ...
- jdk1.8 -- optional 的使用
一.optional的介绍 Optional 是个容器:它可以保存类型T的值,或者仅仅保存null.Optional提供很多有用的方法,这样我们就不用显式进行空值检测. Optional 类的引入很好 ...
- SpreadJS:一款高度类似Excel的开发工具,功能涵盖Excel的 95% 以上
Excel 作为一款深受用户喜爱的电子表格工具,借助其直观的界面.出色的计算性能.数据分析和图表,已经成为数据统计领域不可或缺的软件之一. 基于Excel对数据处理与分析的卓越表现,把Excel的功能 ...
- icell更改用户管理员
管理员页面是http://127.0.0.1:8080/PORTAL/tsysLoginController/admin超级管理员是http://127.0.0.1:8080/PORTAL/tsysL ...
- java中讲讲DataInputStream的用法,举例?
[学习笔记] 2.4 DataInputStream的用法 马 克-to-win:DataInputStream顾名思义:就是专门用来读各种各样的数据的,比如(int,char,long等),一定要注 ...
- ubuntu 连接宽带
ubuntu 连接宽带 链接: https://blog.csdn.net/selous/article/details/55520765 主要命令 pppoeconf pon dsl-provide ...
- 第三章 VIVADO 自定义IP 流水灯实验
第二章里面已经说过了,MIZ701 PL部分没有输入时钟,因此驱动PL资源必须是通过PS来提供时钟,所以这个流水灯实验也得建立一个最小系统了,然后再添加一个流水灯的自定义IP. 3.0本章难度系数★★ ...
- 【广搜】Knight Moves
题目描述 Mr Somurolov, fabulous chess-gamer indeed, asserts that no one else but him can move knights fr ...
- Java String类源码
String类的签名(JDK 8): public final class String implements java.io.Serializable, Comparable<String&g ...
- C#向远程地址发送数据
static string proxyIpAddress = AppConfig.GetProxyIpAddress; static string proxyUserName = AppConfig. ...