题意

给你一个有向图或无向图,要求输出其中一条欧拉回路。
n≤100000 n ≤ 100000 n\le100000

分析

圈套圈算法求欧拉回路的模版题。
这个算法大概是,从某个点开始走,然后用一个栈存放所有走过的点。当走到死胡同时就退栈,直到退到某个点仍然存在出边,然后继续沿着出边走下去。
这可以看成是先找到一个环,然后再找到另一个环,接着把这两个环拼在一起,就形成了一个更大的环。不停的操作下去,就可以得到极大环也就是欧拉回路了。

代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>const int N=100005;int ty;struct Task1
{int n,m,cnt,last[N],deg[N],f[N],stack[N*2],num[N*2],ans[N*2],tot;struct edge{int to,next,id;bool use;}e[N*4];void addedge(int u,int v){e[++cnt].to=v;e[cnt].next=last[u];last[u]=cnt;e[++cnt].to=u;e[cnt].next=last[v];last[v]=cnt;}int find(int x){if (f[x]==x) return x;else return f[x]=find(f[x]);}void work(){int top=0,s;for (int i=1;i<=n;i++) if (deg[i]) {s=i;break;}stack[++top]=s;while (top){int x=stack[top];while (e[last[x]].use) last[x]=e[last[x]].next;if (last[x]){stack[++top]=e[last[x]].to;num[top]=(last[x]&1)?-last[x]/2:last[x]/2;e[last[x]].use=e[last[x]^1].use=1;last[x]=e[last[x]].next;}else{while (top&&!last[stack[top]]){if (top>1) ans[++tot]=num[top];top--;}}}while (tot) printf("%d ",ans[tot]),tot--;}void solve(){scanf("%d%d",&n,&m);cnt=1;for (int i=1;i<=n;i++) f[i]=i;int sum=n;for (int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);addedge(x,y);deg[x]++;deg[y]++;if (find(x)!=find(y)) f[find(x)]=find(y),sum--;}for (int i=1;i<=n;i++) if (!deg[i]) sum--;if (sum>1) {puts("NO");return;}for (int i=1;i<=n;i++) if (deg[i]&1) {puts("NO");return;}puts("YES");work();}
}t1;struct Task2
{int n,m,cnt,f[N],rd[N],cd[N],last[N],stack[N*2],num[N*2],ans[N*2],tot;struct edge{int to,next,id;}e[N*2];void addedge(int u,int v){e[++cnt].to=v;e[cnt].next=last[u];last[u]=cnt;}int find(int x){if (f[x]==x) return x;else return f[x]=find(f[x]);}void work(){int top=0,s;for (int i=1;i<=n;i++) if (cd[i]) {s=i;break;}stack[++top]=s;while (top){int x=stack[top];if (last[x]){stack[++top]=e[last[x]].to;num[top]=last[x];last[x]=e[last[x]].next;}else{while (top&&!last[stack[top]]){if (top>1) ans[++tot]=num[top];top--;}}}while (tot) printf("%d ",ans[tot]),tot--;}void solve(){scanf("%d%d",&n,&m);for (int i=1;i<=n;i++) f[i]=i;int sum=n;for (int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);addedge(x,y);rd[y]++;cd[x]++;if (find(x)!=find(y)) f[find(x)]=find(y),sum--;}for (int i=1;i<=n;i++) if (!rd[i]&&!cd[i]) sum--;if (sum>1) {puts("NO");return;}for (int i=1;i<=n;i++) if (rd[i]!=cd[i]) {puts("NO");return;}puts("YES");work();}
}t2;int main()
{scanf("%d",&ty);if (ty==1) t1.solve();else t2.solve();return 0;
}

uoj #117. 欧拉回路 圈套圈算法求欧拉回路相关推荐

  1. 【老生谈算法】matlab实现Kruskal避圈算法求最小生成树——Kruskal避圈算法

    基于MATLAB的Kruskal避圈算法求最小生成树 1.原文下载: 本算法原文如下,有需要的朋友可以点击进行下载 序号 原文(点击下载) 本项目原文 [老生谈算法]基于MATLAB的Kruskal避 ...

  2. UVA10054-The Necklace(无向图欧拉回路——套圈算法)

    Problem UVA10054-The Necklace Time Limit: 3000 mSec Problem Description Input The input contains T t ...

  3. Fleury算法 求欧拉回路

    Fleury算法 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include ...

  4. 消圈算法c语言,【图论】Floyd消圈算法

    Definition&Solution 对于一个给定的链表,如何判定它是否存在环以及环的长度问题,可以使用Floyd消圈算法求出. 从某种意义上来讲,带环的链表在本质上是一个有向图 考虑下面的 ...

  5. UOJ 117 欧拉回路(套圈法+欧拉回路路径输出+骚操作)

    题目链接:http://uoj.ac/problem/117 题目大意: 解题思路:先判断度数: 若G为有向图,欧拉回路的点的出度等于入度. 若G为无向图,欧拉回路的点的度数位偶数. 然后判断连通性, ...

  6. uoj 117 欧拉回路

    1.判断是否为欧拉存在欧拉回路---裸的判断 欧拉回路就是看一笔能不能把途中所有的边跑完没得重复 对于无向边----建立双向边判断每个点的入度是否为2的倍数   1.1 对于有向边---建立单向边判断 ...

  7. 实现求欧拉回路算法(C++)

    一.算法介绍及实现过程: 程序的输入为对应图的结点数和图中与各结点相连的点的编号.(注:无向图中的多重边和自环需多次输入:有向图中的多重边需多次输入) 程序的第一步是求出图的邻接矩阵.邻接矩阵反映了点 ...

  8. 离散数学实验-01 可简单图化,连通图和欧拉图的判断(利用Fleury算法输出欧拉回路)

    离散数学的实验 实验要求 给定一非负整数序列(例如:(4,2,2,2,2)). 判断此非负整数序列是否是可图化的,是否是可简单图化的. 如果是可简单图化的,根据Havel定理过程求出对应的简单图,并输 ...

  9. 第九章第十三节(无向图求欧拉回路)

    欧拉环游:在图中找到一条路径,从起点开始,依此经过图中的所有边,一个边只能走一次,到达终点,终点和起点可以不同 欧拉回路:在图中找到一条路径,从起点开始,依此经过图中的所有边,最后回到起点,一个边只能 ...

最新文章

  1. idea配置jfinal_Jfinal 项目在idea上创建
  2. mysql字段掩码_在必须输入字母A~Z或数字0~9数据库中设计表时,如果将字段的输入掩码设置为“LLLL”,则该字段能够接受的输入是()_学小易找答案...
  3. 【下载】RSA1024及RSA2048加密算法漏洞CVE-2017-7526 问题出在GnuPG加密库
  4. nyoj 12(区间覆盖)
  5. java分治_【Java算法】什么是分治算法?
  6. MySQL 5.6, 5.7并行复制测试(二)(r12笔记第10天)
  7. python处理pdf文档_pyPdf - 用Python方便的处理PDF文档
  8. atitit 用什么样的维度看问题.docx 如何了解 看待xxx
  9. MySQL数据库索引教程(超详细)
  10. 想要专升本你不得不看的全干货_吐血整理_专升本_计算机文化基础(七)
  11. 高阶的Parser:可变运算优先级
  12. Java实战推箱子——菜鸟之路
  13. 密西根州立大学计算机qs分数,密歇根州立大学商科排名怎么样?2021年密歇根州立大学QS商科硕士排名商业分析硕士专业排名第20...
  14. 51单片机精确延时程序(晶振12MHz,一个机器周期1us.)
  15. python实验收获与反思 100字_期中考试总结与反思100字
  16. Boost库系列:asio总结
  17. 库存明细帐处理示例(包含结存数).sql
  18. JavaWeb学习笔记(十三)之session的钝化和活化
  19. excel 删除重复项_在Excel 2007中删除重复项
  20. Oracle递归查询的使用

热门文章

  1. Linux运维好学还是开发好学,运维提升需要学习开发技能吗?
  2. Windows Sysinternals 微软官方免费的极品实用绿色小工具合集
  3. 白璐:黄海波嫖娼:女主角是双性人还是变性人?
  4. 【HRNet2019】Deep High-Resolution Representation Learning for Visual Recognition
  5. 谱聚类python代码_Python 谱聚类算法从零开始
  6. 复旦大学计算机考研学硕,13年复旦大学考研:写个所有纠结学硕的学弟学妹们...
  7. Ubuntu无法进行联网的解决方法
  8. jq删除某个css样式,jq删除属性_使用jquery删除css属性或样式
  9. 苏宁金融再推VR众筹项目 目标金额达百万
  10. 2018 年了,你还是只会 npm install 吗?