找欧拉回路的模板题。


知识点详见图连通性学习笔记。

注意一些写法上的问题。

  • 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 欧拉回路[欧拉回路]的更多相关文章

  1. UOJ117:欧拉回路——题解

    http://uoj.ac/problem/117 (作为一道欧拉回路的板子题,他成功的令我学会了欧拉回路) (然而我不会背……) 就两件事: 1.无向图为欧拉图,当且仅当为连通图且所有顶点的度为偶数 ...

  2. 【UOJ117】 欧拉回路(欧拉回路)

    传送门 UOJ Solution 无解 t=1,无向图,当且仅当\(\exists i \ \ in_i \ne out_i\) t=2,有向图,当且仅当\(\exists i \ \ in_i是奇数 ...

  3. HDU-1878 欧拉回路 欧拉回路

    题目链接:https://cn.vjudge.net/problem/HDU-1878 题意 中文题,而且就是单纯的欧拉回路 思路 判断连通图 用并查集会很好,bfs亦可 一时脑抽用bfs过了这个题, ...

  4. K - 欧拉回路(并查集)

    点击打开链接 K - 欧拉回路 欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路.现给定一个图,问是否存在欧拉回路? Input 测试输入包含若干测试用例.每个测试用例的第 ...

  5. ACM3018欧拉回路

    欧拉回路 欧拉回路:图G,若存在一条路,经过G中每条边有且仅有一次,称这条路为欧拉路,如果存在一条回路经过G每条边有且仅有一次, 称这条回路为欧拉回路.具有欧拉回路的图成为欧拉图. 判断欧拉路是否存在 ...

  6. POJ2513 Colored Sticks(Trie+欧拉回路)

    Description You are given a bunch of wooden sticks. Each endpoint of each stick is colored with some ...

  7. UOJ117. 欧拉回路【欧拉回路模板题】

    LINK 题目大意 就是让你对有向图和无向图分别求欧拉回路 非常的模板,但是由于UOJ上毒瘤群众太多了 所以你必须加上一个小优化 就是每次访问过一个边就把它删掉 有点像Dinic的当前弧优化的感觉 注 ...

  8. 欧拉回路 uoj117

    写了一道欧拉回路的模板题.先判断是否是欧拉回路,有向图和无向图有一点点不同,然后就是特判独立点的存在. 之后是输出路径,和dls学的dfs,利用last数组的更新可以做到线性的复杂度,否则一不小心就会 ...

  9. uoj117 欧拉回路

    题目描述: 有一天一位灵魂画师画了一张图,现在要你找出欧拉回路,即在图中找一个环使得每条边都在环上出现恰好一次. 一共两个子任务: 这张图是无向图.(50 分) 这张图是有向图.(50 分) 输入格式 ...

随机推荐

  1. Linux上,最常用的一批命令解析(10年精选)

    Linux这么多命令,通常会让初学者望而生畏.下面是我结合日常工作,以及在公司的内部培训中,针对对Linux不是很熟悉的同学,精选的一批必须要搞懂的命令集合.任何一个命令其实都是可以深入的,比如tai ...

  2. 常用的API

    API (application programming Interface)应用程序编程接口 java 是字典 Scanner类的功能可以实现从键盘输入到程序当中. 引用类型的一般使用步骤 ·1导包 ...

  3. [CF132C] Logo Turtle

    [CF132C] Logo Turtle , Luogu A turtle moves following by logos.(length is \(N\)) \(F\) means "m ...

  4. [CF991D]Bishwock_状压dp

    Bishwock 题目链接:http://codeforces.com/problemset/problem/991/D 数据范围:略. 题解: 一眼题. 首先,每个$L$最多只占用两列,而且行数特别 ...

  5. svn clean up

    1.下载sqlite3.exe 2.找到你项目的.svn文件,查看是否存在wc.db3.将sqlite3.exe放到.svn的同级目录4.启动cmd执行sqlite3 .svn/wc.db " ...

  6. C语言字符串替换

    void exchg(char * str) { if(str == NULL) return; int len = strlen(str); char tmp; for(int i=0,j=len- ...

  7. Angular7如何动态刷新Echarts图表

    1 概述 echarts是百度的开源图表插件 Angular中引入echarts网上教程很多 Angular引入echarts,并使用动态刷新 2 安装 请参考大神的博客:https://blog.c ...

  8. 在javascript对象内搜索,貌似是一个新鲜的话题。

    为啥 也不为啥,因为没找到. 用途 也没啥用途,比如,在电影网站找到链接,在小说网站找到链接.二货同事写的复杂对象.等等吧.反正要搜索就对了. 目标 在对象内,无论多少层,找到关键字. 关键字可能的位 ...

  9. Unity上线google商店 用IL2Cpp打包64位版本和Android APP Bundle优化 及产生的bug

    ios刚上线,这边着手改成android版本,我开始使用的是unity2017.4.1版本 上传谷歌商店是出现这两个警告: 要支持64位,但是在2017版本上没有找到64位的打包选项,猜测应该是版本的 ...

  10. EFcore的 基础理解<三> 多对多,唯一约束

    唯一约束,替代键. modelBuilder.Entity<Car>() .HasAlternateKey(c => new { c.State, c.LicensePlate }) ...