uoj #117. 欧拉回路 套圈法
题面
题意
给出一幅有向或无向图,判断是否存在一个环走遍所有边,若有则输出求其中的环.
做法
首先判断很容易,对于无向图只要联通且度数都是偶数即可,对于有向图,则要联通且入度等于出度,问题在于如何找到这个环.
我们可以发现,如果随便走的话,必然会回到出发点,但是不一定走过所有的边,而剩下的图恰是一条与我们之前走的路有交点的欧拉回路,没有走完的原因就是我们之前有些地方走错了,因此要退回到两条路的焦点,也就是还有边没有走过的点,然后走完剩余图中的欧拉回路,再走之前倒退的路即可,用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. 欧拉回路 套圈法相关推荐
- uoj #117. 欧拉回路 圈套圈算法求欧拉回路
题意 给你一个有向图或无向图,要求输出其中一条欧拉回路. n≤100000 n ≤ 100000 n\le100000 分析 圈套圈算法求欧拉回路的模版题. 这个算法大概是,从某个点开始走,然后用一个 ...
- UOJ 117 欧拉回路(套圈法+欧拉回路路径输出+骚操作)
题目链接:http://uoj.ac/problem/117 题目大意: 解题思路:先判断度数: 若G为有向图,欧拉回路的点的出度等于入度. 若G为无向图,欧拉回路的点的度数位偶数. 然后判断连通性, ...
- UOJ #117. 欧拉回路
#117. 欧拉回路 在图中找一个环使得每条边都在环上出现恰好一次. 要注意的地方好多啊 每条边恰好出现一次!!! 条件:每个点偶度 / 入度=出度 方法就是套圈法啦 然后本题自环是合法的,如果200 ...
- uoj 117 欧拉回路
1.判断是否为欧拉存在欧拉回路---裸的判断 欧拉回路就是看一笔能不能把途中所有的边跑完没得重复 对于无向边----建立双向边判断每个点的入度是否为2的倍数 1.1 对于有向边---建立单向边判断 ...
- UOJ - #117. 欧拉回路(模板)
题目链接:点击查看 题目大意:给出一个 nnn 个点 mmm 条边的图,可能是有向图或无向图,求一条欧拉回路 题目分析:有个小坑点就是图必须是联通的 代码: // Problem: #117. 欧拉回 ...
- UVA10054-The Necklace(无向图欧拉回路——套圈算法)
Problem UVA10054-The Necklace Time Limit: 3000 mSec Problem Description Input The input contains T t ...
- 【c++/euler】套圈法解有向图的欧拉回路
[参考]Matching_Euler_Tours_and_the_Chinese_Postman [REPRESENTATION]The edge-pairingrepresentation[表示方法 ...
- UOJ.117.欧拉回路
题目链接 这数据..简直了 有自环和重边,有些点可能没有连边(并查集不好使 就DFS吧) 因为重边+自环可能非常多,同一个点可能经过n次,所以必须要重置表头H[x](类似当前弧优化) 另外是找欧拉回路 ...
- 力扣 LCP 42. 玩具套圈 (数学公式反推)
题意 场地外,小力组织了一个套玩具的游戏.所有的玩具摆在平地上,toys[i] 以 [xi,yi,ri] 的形式记录了第 i 个玩具的坐标 (xi,yi) 和半径 ri.小扣试玩了一下,他扔了若干个半 ...
最新文章
- partprobe源码分析
- Android获取存储卡路径的方式(转)
- 手机隔空充电,会有辐射吗?
- 卷死了!再不学vue3就没有人要你了!速来围观vue3新特性
- 1054. The Dominant Color (20)
- 网站html静态化 教程,新云CMS网站内容管理系统生成HTML静态化教程
- Sketch 76 for mac(矢量绘图设计软件)
- android pc投屏,安卓投屏助手pc版
- 使用VGG16.npy文件载入权重
- 【2021最新】4篇图神经网络综述论文,建议收藏!
- 怎么将CAD图纸转化为PDF格式呢?教你两个妙招搞定!
- 易基因 | 表观技术:单细胞及微量细胞全基因组重亚硫酸盐甲基化测序(scWGBS)
- 如何制作基于beaglebone的设备通知Texter ?---凯利讯半导体
- 文件管理服务器win7,Win7如何取得文件管理所有权
- 在canvas画布上多次绘制图形叠加的效果
- js计算距离特定日期多少周多少天
- 微信模拟登陆php投票,PHP爬虫和微信自动投票
- idea测试rest api方法(HTTP client in IntelliJ IDEA code editor)
- 使用VC++通过QQ邮箱发邮件
- Nokia 手机 号码 同 HTC 同步