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 分) 输入格式 ...
随机推荐
- Java学习笔记-抽象类与接口
抽象类用于在类中不用具体实现,而在子类中去实现的类 抽象类 抽象类概述 抽象定义:抽象就是从多个事物中将共性的,本质的内容抽取出来 抽象类:Java中可以定义没有方法体的方法,该方法的具体实现由子类完 ...
- 冲刺Noip2017模拟赛7 解题报告——五十岚芒果酱
1.二叉树(binary) .二叉树 (binary.cpp/c/pas) [问题描述] 二叉排序树或者是一棵空树,或者是具有下列性质的二叉树: ()若左子树不空,则左子树上所有结点的值均小于它的根结 ...
- 洛谷 题解 P2802 【回家】
思路:DFS+剪枝 本题可以用一个字符二维数组来存整个地图,然后在往四个方向进行搜索.注意:当走到家门前要先判断血量!(本人就被坑了) 代码: #include<bits/stdc++.h> ...
- php-fpm的参数优化
查看php-fpm的内存占用 1.查看php-fpm的进程个数 ps -ef |grep "php-fpm"|grep "pool"|wc -l 2.查看每个p ...
- 日常工作问题解决:centos/linux系统如何检测端口是否打开
1.telnet命令 格式: telnet ip 端口号 [root@centos7-127 ~]# telnet 192.168.87.128 22 Trying 192.168.87.128... ...
- vim版本更新
版本问题 ubuntu 14.05 安装完YouCompleteMe后不生效,提示:YouCompleteMe unavailable : requires Vim 7.4.143经过检索与查询,ub ...
- Git初始化配置以及配置github
1,配置用户名和邮箱(这里是我github中配置的用户名和邮箱),执行下面命令后,在C:\Users\yaosq盘下会出现一个全局文件.gitconfig. git config --global u ...
- 【LOJ】#3102. 「JSOI2019」神经网络
LOJ#3102. 「JSOI2019」神经网络 首先我们容易发现就是把树拆成若干条链,然后要求这些链排在一个环上,同一棵树的链不相邻 把树拆成链可以用一个简单(但是需要复杂的分类讨论)的树背包实现 ...
- Python 基础(十六)--随机数模块
random随机数模块 random.randint(1,10):随机1-10包括10 random.randrange(1,10,2):在1.3.5.7.9中随机,类似切片,不包括10 random ...
- 【背包问题】PACKING
题目描述 It was bound to happen. Modernisation has reached the North Pole. Faced with escalating costs ...