欧拉回路&欧拉路径学习笔记
基础性质(用来判定):
1.无向图欧拉回路没有奇数点 (有向图所有点入度等于出度)
2.无向图欧拉路径只有两个奇数点 (有向图有一个顶点入度比出度大1,有一个顶点出度比入度大1,其他的全相等)
3.图连通
找欧拉回路(找不到时找到欧拉路径)算法\(Hierholzer\):
STEP0:判连通性(并查集||dfs||tarjan)
STEP1: 判断奇数点个数(即是否本图有欧拉回路),并寻找起点,如果有奇数点那么他们一定其中一个是起点,如果,没有奇数点则可以随意指定起点
STEP2:从起点开始dfs,对于从u到v点一条边,删除e(u,v)这条边,如果v没有出边,将v入栈,递归到v
STEP3:倒序出输序列
注释:因为欧拉回路在一张图中有很多个,题目常常会要求字典序,所以我会用multiset存图
例题:
1.lougu1341
code:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<set>
using namespace std;
const int MAXX=10000;
multiset<int>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<int>:: 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"<<endl;
return 0;
}
dfs(s);
for(int i=tot;i>=1;--i){
char ss='A'+q[i];
cout<<ss;
}
return 0;
}
欧拉回路&欧拉路径学习笔记的更多相关文章
- FFT/NTT复习笔记&多项式&生成函数学习笔记Ⅲ
第三波,走起~~ FFT/NTT复习笔记&多项式&生成函数学习笔记Ⅰ FFT/NTT复习笔记&多项式&生成函数学习笔记Ⅱ 单位根反演 今天打多校时 1002 被卡科技了 ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
- JAVA GUI编程学习笔记目录
2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...
- seaJs学习笔记2 – seaJs组建库的使用
原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...
- CSS学习笔记
CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...
- HTML学习笔记
HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...
随机推荐
- 工作日志:dispatch_once、网络缓存、分享问题
问题描述一: 每一个接口对应的model的数据在进入对应的模块(视图)时,执行一次本地缓存加载: 执行缓存加载的实现在基类实现. 解决方案: 将dispatch_once_t设置为成员变量: 问题扩展 ...
- Chrome Service Model
Chrome Service Model John Abd-El-Malek February 2016 Objective Move Chrome codebase towards a servic ...
- iOS开发——打包报错error: linker command failed with exit code 1
真机运行没问题,打包报错: clang: error: linker command failed with exit code 1 (use -v to see invocation) 原因:在Xc ...
- iOS开发——剪切板
剪切板的调用是很简单的,常用的就这两个,不管文字或是图片的粘贴复制,对剪切板的操作就是基于下面两个属性的: [UIPasteboard generalPasteboard].string [UIPas ...
- BZOJ5017 炸弹(线段树优化建图+Tarjan+拓扑)
Description 在一条直线上有 N 个炸弹,每个炸弹的坐标是 Xi,爆炸半径是 Ri,当一个炸弹爆炸时,如果另一个炸弹所在位置 Xj 满足: Xi−Ri≤Xj≤Xi+Ri,那么,该炸弹也会被 ...
- [HNOI2004]高精度开根
题目:洛谷P2293.BZOJ1213. 题目大意:给你$n,k(n\leq 10^{10000},k\leq 50)$,求$\lfloor \sqrt[k]{n}\rfloor$. 解题思路:高精度 ...
- 据统计WIN10用户已经比WIN7多
数据统计机构Netmarketshare今天发布了2018年12月份最新的桌面操作系统份额报告.在看似无休止的等待之后,微软在2018年取得了最后的胜利,不仅成为市值最高的公司,而且最新的Window ...
- 【Codeforces Round #422 (Div. 2) A】I'm bored with life
[题目链接]:http://codeforces.com/contest/822/problem/A [题意] 让你求a!和b!的gcd min(a,b)<=12 [题解] 哪个小就输出那个数的 ...
- 洛谷—— P1926 小书童——刷题大军
https://www.luogu.org/problem/show?pid=1926#sub 题目背景 数学是火,点亮物理的灯:物理是灯,照亮化学的路:化学是路,通向生物的坑:生物是坑,埋葬学理的人 ...
- swift 动态设置UILabel的高度
import UIKit class ViewController3: UIViewController { override func viewDidLoad() { ...