博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
欧拉回路&欧拉路径学习笔记
阅读量:5052 次
发布时间:2019-06-12

本文共 1512 字,大约阅读时间需要 5 分钟。

基础性质(用来判定):

1.无向图欧拉回路没有奇数点 (有向图所有点入度等于出度)
2.无向图欧拉路径只有两个奇数点 (有向图有一个顶点入度比出度大1,有一个顶点出度比入度大1,其他的全相等)
3.图连通

找欧拉回路(找不到时找到欧拉路径)算法\(Hierholzer\)

STEP0:判连通性(并查集||dfs||tarjan)
STEP1: 判断奇数点个数(即是否本图有欧拉回路),并寻找起点,如果有奇数点那么他们一定其中一个是起点,如果,没有奇数点则可以随意指定起点
STEP2:从起点开始dfs,对于从u到v点一条边,删除e(u,v)这条边,如果v没有出边,将v入栈,递归到v
STEP3:倒序出输序列
注释:因为欧拉回路在一张图中有很多个,题目常常会要求字典序,所以我会用multiset存图

例题:

1.
code:
#include
#include
#include
#include
using namespace std;const int MAXX=10000;multiset
to[MAXX];int f[MAXX],deg[MAXX],q[MAXX];int n,tot,ans,cnt,s=-1;bool vis[MAXX],num[MAXX],flag;inline int find(int x){ if(f[x]==x)return x; else return f[x]=find(f[x]);}inline void dfs(int x){ for(set
:: iterator it=to[x].begin();it!=to[x].end();it=to[x].begin()){ int y=*it; to[x].erase(it); to[y].erase(to[y].find(x)); dfs(y); } q[++tot]=x;}int main(){ cin>>n; for(int i=0;i<=99;++i)f[i]=i; for(int i=1;i<=n;++i){ char a,b; int x,y; cin>>a>>b; x=a-'A';y=b-'A'; int u=find(x); int v=find(y); f[u]=v; vis[x]=1;vis[y]=1; deg[x]++;deg[y]++; to[x].insert(y); to[y].insert(x); } for(int i=0;i<=99;++i){ if(!vis[i])continue; num[find(i)]=1; } for(int i=0;i<=99;++i){ if(!vis[i])continue; ans+=num[i]; if(s==-1)s=i; if(deg[i]&1){ cnt++; if(flag)continue; s=i; flag=1; } } if((cnt!=0&&cnt!=2)||ans>1){ cout<<"No Solution"<
=1;--i){ char ss='A'+q[i]; cout<

转载于:https://www.cnblogs.com/ARTlover/p/9546644.html

你可能感兴趣的文章
PHP链接sqlserver出现中文乱码
查看>>
[计算机]Alan Perlis人物简介
查看>>
Android-----第三方 ImageLoader 的简单配置和使用
查看>>
零基础入门Python3-详解分支
查看>>
js数组去重
查看>>
A. E-mail
查看>>
C# 反射机制以及方法
查看>>
C# Socket服务端与客户端通信(包含大文件的断点传输)
查看>>
美丽汤的请求 - 小甜饼豆瓣爬虫
查看>>
关于前端性能优化的思考
查看>>
文字超出隐藏
查看>>
0Day – 2011.02.04
查看>>
VS错误error C3872: '0x3000': this character is not allowed in an identifier
查看>>
mooc 数据结构作业(二)祖玛(Zuma)
查看>>
安装 zabbix 时遇到的一个问题
查看>>
并发连接数对浏览器加载速度的测试
查看>>
python特性property
查看>>
【Shell脚本】字符串处理
查看>>
理解SQL SERVER中的逻辑读,预读和物理读
查看>>
输入N,打印如图所看到的的三角形(例:N=3,N=4,N=5)1&lt;=N&lt;=26
查看>>