题面

题意

给出一幅有向或无向图,判断是否存在一个环走遍所有边,若有则输出求其中的环.

做法

首先判断很容易,对于无向图只要联通且度数都是偶数即可,对于有向图,则要联通且入度等于出度,问题在于如何找到这个环.
我们可以发现,如果随便走的话,必然会回到出发点,但是不一定走过所有的边,而剩下的图恰是一条与我们之前走的路有交点的欧拉回路,没有走完的原因就是我们之前有些地方走错了,因此要退回到两条路的焦点,也就是还有边没有走过的点,然后走完剩余图中的欧拉回路,再走之前倒退的路即可,用dfs不断反复上述过程即可.
这里要注意一个优化,一个点已经走过的边不重复遍历(否则最劣会退化为O(m^2)),也就是修改每个点的第一条边(详见代码).

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#define GG return void(puts("NO"));
#define N 100100
using namespace std;int T,n,m,bb=1,first[N],cnt,ans[N<<1],ds[N];
struct Bn
{int to,next;bool vis;
}bn[N<<2];inline void add(int u,int v)
{bb++;bn[bb].to=v;bn[bb].next=first[u];first[u]=bb;
}namespace solve1
{void dfs(int now){int p,q;for(p=first[now];p!=-1;p=first[now]){first[now]=bn[p].next;//重要优化if(bn[p].vis) continue;bn[p].vis=bn[p^1].vis=1;dfs(bn[p].to);ans[++cnt]=p/2;if(p%2) ans[cnt]*=-1;}}void work(){int i,j,p,q;cin>>n>>m;for(i=1;i<=m;i++){scanf("%d%d",&p,&q);add(p,q),add(q,p);ds[p]++,ds[q]++;}for(i=1;i<=n;i++){if(ds[i]%2) GG;}for(i=1;i<=n;i++){if(ds[i]){dfs(i);break;}}if(cnt!=m) GG;puts("YES");for(i=cnt;i>=1;i--){printf("%d ",ans[i]);}}
}namespace solve2
{void dfs(int now){int p,q;for(p=first[now];p!=-1;p=first[now]){first[now]=bn[p].next;//重要优化if(bn[p].vis) continue;bn[p].vis=1;dfs(bn[p].to);ans[++cnt]=p-1;}}void work(){int i,j,p,q;cin>>n>>m;for(i=1;i<=m;i++){scanf("%d%d",&p,&q);add(p,q),ds[p]++,ds[q]--;}for(i=1;i<=n;i++){if(ds[i]) GG;}for(i=1;i<=n;i++){if(first[i]!=-1){dfs(i);break;}}if(cnt!=m) GG;puts("YES");for(i=cnt;i>=1;i--){printf("%d ",ans[i]);}}
}int main()
{memset(first,-1,sizeof(first));int i,j;cin>>T;T==1?solve1::work():solve2::work();
}

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

  1. uoj #117. 欧拉回路 圈套圈算法求欧拉回路

    题意 给你一个有向图或无向图,要求输出其中一条欧拉回路. n≤100000 n ≤ 100000 n\le100000 分析 圈套圈算法求欧拉回路的模版题. 这个算法大概是,从某个点开始走,然后用一个 ...

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

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

  3. UOJ #117. 欧拉回路

    #117. 欧拉回路 在图中找一个环使得每条边都在环上出现恰好一次. 要注意的地方好多啊 每条边恰好出现一次!!! 条件:每个点偶度 / 入度=出度 方法就是套圈法啦 然后本题自环是合法的,如果200 ...

  4. uoj 117 欧拉回路

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

  5. UOJ - #117. 欧拉回路(模板)

    题目链接:点击查看 题目大意:给出一个 nnn 个点 mmm 条边的图,可能是有向图或无向图,求一条欧拉回路 题目分析:有个小坑点就是图必须是联通的 代码: // Problem: #117. 欧拉回 ...

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

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

  7. 【c++/euler】套圈法解有向图的欧拉回路

    [参考]Matching_Euler_Tours_and_the_Chinese_Postman [REPRESENTATION]The edge-pairingrepresentation[表示方法 ...

  8. UOJ.117.欧拉回路

    题目链接 这数据..简直了 有自环和重边,有些点可能没有连边(并查集不好使 就DFS吧) 因为重边+自环可能非常多,同一个点可能经过n次,所以必须要重置表头H[x](类似当前弧优化) 另外是找欧拉回路 ...

  9. 力扣 LCP 42. 玩具套圈 (数学公式反推)

    题意 场地外,小力组织了一个套玩具的游戏.所有的玩具摆在平地上,toys[i] 以 [xi,yi,ri] 的形式记录了第 i 个玩具的坐标 (xi,yi) 和半径 ri.小扣试玩了一下,他扔了若干个半 ...

最新文章

  1. partprobe源码分析
  2. Android获取存储卡路径的方式(转)
  3. 手机隔空充电,会有辐射吗?
  4. 卷死了!再不学vue3就没有人要你了!速来围观vue3新特性
  5. 1054. The Dominant Color (20)
  6. 网站html静态化 教程,新云CMS网站内容管理系统生成HTML静态化教程
  7. Sketch 76 for mac(矢量绘图设计软件)
  8. android pc投屏,安卓投屏助手pc版
  9. 使用VGG16.npy文件载入权重
  10. 【2021最新】4篇图神经网络综述论文,建议收藏!
  11. 怎么将CAD图纸转化为PDF格式呢?教你两个妙招搞定!
  12. 易基因 | 表观技术:单细胞及微量细胞全基因组重亚硫酸盐甲基化测序(scWGBS)
  13. 如何制作基于beaglebone的设备通知Texter ?---凯利讯半导体
  14. 文件管理服务器win7,Win7如何取得文件管理所有权
  15. 在canvas画布上多次绘制图形叠加的效果
  16. js计算距离特定日期多少周多少天
  17. 微信模拟登陆php投票,PHP爬虫和微信自动投票
  18. idea测试rest api方法(HTTP client in IntelliJ IDEA code editor)
  19. 使用VC++通过QQ邮箱发邮件
  20. Nokia 手机 号码 同 HTC 同步

热门文章

  1. 第4章 Linux网络编程 22.多进程实现并发服务器、多线程实现并发服务器
  2. 自己动手搞一个tip 插件
  3. 2019-08-07 win10 pro 激活
  4. 湖南大学平台2串口部分第二次实验
  5. DS树结构转换(先序转双亲)
  6. 状态栏点击没反应解决方法
  7. node Sream
  8. Express-基础语法
  9. Docker常见网络操作
  10. 无代码开发的五大好处