图论知识——欧拉回路(一笔画问题) Hierholzer方法

2023-11-10 16:41

本文主要是介绍图论知识——欧拉回路(一笔画问题) Hierholzer方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

许多题目看起来是模拟,其实应该抽象为数学模型,寻找效率更高的解题方法
前置知识
欧拉回路不等于欧拉路径,AB BC CA构成欧拉环路ABCA,符合题意。AB BC CD构成欧拉路径ABCD,也符合题意。
https://blog.csdn.net/qq_34454069/article/details/77779300
https://blog.csdn.net/qq632544991p/article/details/51097077
题目:https://www.luogu.org/problemnew/show/P1341
题解
https://blog.csdn.net/stillxjy/article/details/51956183
https://blog.csdn.net/binling/article/details/51742845
https://blog.csdn.net/binling/article/details/51742845
Hierholzer :
在本题中,n个无序字母对构成n+1长度的欧拉回路或欧拉字母对,那么只要通过度来判定是欧拉回路或者欧拉路径,那么只要找到起始点就一定可以简单的通过DFS找出该路径。
写法一:

#include<bits/stdc++.h>
using namespace std;
int a[106],c[10006],du[101],n,x,y,k,t,tot=0;
bool b[106][106];
char s[2];
void dfs(int u){for(int i=0;i<58;i++)if(b[u][i]){b[u][i]=b[i][u]=0;//删边 dfs(i);}c[++tot]=u;//递归退栈时存储,所以顺序是反的,也可以用栈 
}
int main(){cin>>n;k=0xfffffff;//重要赋值 for(int i=1;i<=n;i++){cin>>s;x=s[0]-'A'; y=s[1]-'A';//节省空间 k=min(k,min(x,y));b[x][y]=b[y][x]=1;//无向图标记路径 du[x]++;du[y]++;//计算度 }for(int i=0;i<58;i++)if(du[i]&1) a[++a[0]]=i;//计算度是奇数的点,并保存 if(a[0]==0) dfs(k);//题目要求输出字典序最小的方案 
//没有度为奇数的点 ,这是欧拉环路的情况 else if(a[0]==2) dfs(a[1]);//第一个度为奇数的点是端点 
//度为奇数的点为两个,这两个是两端的端点,这是欧拉路径的情况else{cout<<"No Solution\n";return 0;//必须有这个返回 }for(int i=tot;i>=1;i--) printf("%c",c[i]+'A');//for(int i=tot;i>=1;i--) cout<<c[i]+'A';//输出不规范,要用格式化输出return 0;
}

在这里插入图片描述
写法二:

#include<bits/stdc++.h>
using namespace std;
int n,x,y,k,i,ss=0;
bool b[106][106];
char s[2];
int cnt[106]={0};
stack<int> c;
void dfs(int u){for(int i=0;i<58;i++)if(b[u][i]){b[u][i]=b[i][u]=0;//删边 dfs(i);}c.push(u);//递归退栈时存储,所以顺序是反的,也可以用栈 
}
int main(){cin>>n;k=0xfffffff;//重要赋值 vector<int> cnt(106,0);//变长数组的赋值 for(int i=1;i<=n;i++){cin>>s;x=s[0]-'A'; y=s[1]-'A';//节省空间 k=min(k,min(x,y));b[x][y]=b[y][x]=1;//无向图标记路径 cnt[x]^=1;cnt[y]^=1;
//利用异或运算,同0异1,运算偶数次是0,运算奇数次是1 }for(i=0;i<106;i++) if(cnt[i]) ss++; 
//要对所有的点进行遍历,ss是度为奇数的点的个数 if(ss&&ss!=2){
//条件取反:ss=0||s=2,即欧拉回路的情况和欧拉路径的情况 cout<<"No Solution\n";return 0;//必须有这个返回 }for(i=0;i<106;i++)if(cnt[i]) break; if(i==106) dfs(k);
//没有度为奇数的点,及该情况是欧拉回路 ,k保证最小字典序 else dfs(i); //该情况是欧拉路径 ,也能保证最小字典序 while(!c.empty()){printf("%c",c.top()+'A');c.pop();}cout<<endl;return 0;
}

在这里插入图片描述

这篇关于图论知识——欧拉回路(一笔画问题) Hierholzer方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/383959

相关文章

postgresql使用UUID函数的方法

《postgresql使用UUID函数的方法》本文给大家介绍postgresql使用UUID函数的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录PostgreSQL有两种生成uuid的方法。可以先通过sql查看是否已安装扩展函数,和可以安装的扩展函数

Spring的RedisTemplate的json反序列泛型丢失问题解决

《Spring的RedisTemplate的json反序列泛型丢失问题解决》本文主要介绍了SpringRedisTemplate中使用JSON序列化时泛型信息丢失的问题及其提出三种解决方案,可以根据性... 目录背景解决方案方案一方案二方案三总结背景在使用RedisTemplate操作redis时我们针对

Java中Arrays类和Collections类常用方法示例详解

《Java中Arrays类和Collections类常用方法示例详解》本文总结了Java中Arrays和Collections类的常用方法,涵盖数组填充、排序、搜索、复制、列表转换等操作,帮助开发者高... 目录Arrays.fill()相关用法Arrays.toString()Arrays.sort()A

Kotlin Map映射转换问题小结

《KotlinMap映射转换问题小结》文章介绍了Kotlin集合转换的多种方法,包括map(一对一转换)、mapIndexed(带索引)、mapNotNull(过滤null)、mapKeys/map... 目录Kotlin 集合转换:map、mapIndexed、mapNotNull、mapKeys、map

Nginx安全防护的多种方法

《Nginx安全防护的多种方法》在生产环境中,需要隐藏Nginx的版本号,以避免泄漏Nginx的版本,使攻击者不能针对特定版本进行攻击,下面就来介绍一下Nginx安全防护的方法,感兴趣的可以了解一下... 目录核心安全配置1.编译安装 Nginx2.隐藏版本号3.限制危险请求方法4.请求限制(CC攻击防御)

nginx中端口无权限的问题解决

《nginx中端口无权限的问题解决》当Nginx日志报错bind()to80failed(13:Permissiondenied)时,这通常是由于权限不足导致Nginx无法绑定到80端口,下面就来... 目录一、问题原因分析二、解决方案1. 以 root 权限运行 Nginx(不推荐)2. 为 Nginx

python生成随机唯一id的几种实现方法

《python生成随机唯一id的几种实现方法》在Python中生成随机唯一ID有多种方法,根据不同的需求场景可以选择最适合的方案,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习... 目录方法 1:使用 UUID 模块(推荐)方法 2:使用 Secrets 模块(安全敏感场景)方法

解决1093 - You can‘t specify target table报错问题及原因分析

《解决1093-Youcan‘tspecifytargettable报错问题及原因分析》MySQL1093错误因UPDATE/DELETE语句的FROM子句直接引用目标表或嵌套子查询导致,... 目录报js错原因分析具体原因解决办法方法一:使用临时表方法二:使用JOIN方法三:使用EXISTS示例总结报错原

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口