欧拉路径欧拉回路

欧拉回路,指遍历图时通过图中每条边且仅通过一次,最终回到起点的一条闭合回路,适用于有向图与无向图,如果不强制要求回到起点,则被称为欧拉路径。

欧拉图:具备欧拉回路的图

  • 无向图:图的所有顶点度数都是偶数
  • 有向图:图的所有顶点入度与出度相等

1->2->3->4->5->1即为一条欧拉回路,欧拉图可以有多个欧拉回路,其起点不唯一

半欧拉图:具有欧拉路径但不具有欧拉回路

  • 无向图:有且仅有两个顶点度数为奇数,这两个点就是欧拉路径的起始点
  • 有向图:有且仅有一个顶点出度-入度=1,且有且仅有一个入度-出度=1,这两个即为起始点

1->2->3->1->5->4->3即为一条欧拉路径,1,3为起始点

求取一个图的欧拉路径,可以利用dfs,每遍历一条边就将这条边消去,当遍历到的顶点度数为0时则将其入栈,最后一个个出栈,就是欧拉路径经过的顶点顺序

判断图是否具有欧拉路径

bool iseuler() {int c=0;for (int i=1; i<=n; i++) {if (edge[i]%2==1) c++;}if (c>2) return false;//超过两个度数为奇数的点,则不能形成欧拉路径if (c>0) flag=false;//记录是否为欧拉图,0个奇数度数点则为欧拉图return true;
}

求取欧拉路径

void dfs(int node){for (int i=1;i<=n;i++){//不断遍历,直到这个顶点度数为0if (g[node][i]){g[node][i]=g[i][node]=0;//无向图需要消除双向边,有向图则只消除一条edge[i]--;edge[node]--;dfs(i);//继续遍历下一个顶点}}s.push(node);//度数为0入栈
}void euler() {if(flag) {//欧拉图,起点随意for (int i=1; i<=n; i++)if (edge[i]) {dfs(i);break;}}else {//半欧拉图,起点需要是奇数度点for (int i=1;i<=n;i++){if (edge[i]%2==1){dfs(i);break;}}}
}

完整代码

 

#include <bits/stdc++.h>
#define maxn 1005
using namespace std;
int n;
int g[maxn][maxn]= {0};
int edge[maxn]={0};
bool flag=true;
stack<int> s;
bool iseuler() {int c=0;for (int i=1; i<=n; i++) {if (edge[i]%2==1) c++;}if (c>2) return false;if (c>0) flag=false;return true;
}void dfs(int node){for (int i=1;i<=n;i++){if (g[node][i]){g[node][i]=g[i][node]=0;edge[i]--;edge[node]--;dfs(i);}}s.push(node);
}void euler() {if(flag) {for (int i=1; i<=n; i++)if (edge[i]) {dfs(i);break;}}else {for (int i=1;i<=n;i++){if (edge[i]%2==1){dfs(i);break;}}}
}int main() {cin>>n;int x,y;int k=n;while(k--) {cin>>x>>y;g[x][y]=g[y][x]=1;edge[x]++;edge[y]++;}if (!iseuler()) {cout<<"false";return 0;}euler();while(!s.empty()){cout<<s.top()<<' ';s.pop();}return 0;
}

运行结果

相关题目

. - 力扣(LeetCode)

力扣753 破解保险箱

示例 1:

输入:n = 1, k = 2
输出:"10"
解释:密码只有 1 位,所以输入每一位就可以。"01" 也能够确保打开保险箱。

示例 2:

输入:n = 2, k = 2
输出:"01100"
解释:对于每种可能的密码:
- "00" 从第 4 位开始输入。
- "01" 从第 1 位开始输入。
- "10" 从第 3 位开始输入。
- "11" 从第 2 位开始输入。
因此 "01100" 可以确保打开保险箱。"01100"、"10011" 和 "11001" 也可以确保打开保险箱。

以n=3举例,我们可以将所有n-1长度的密码组合00,01,10,11看作四个顶点,它们的边即为可能的保险箱密码,求取此图欧拉回路即可

//欧拉回路
#define mod 
bool book[10000];
char ans[10000];
int kk,l,m;void dfs(int node){for (int i=0;i<kk;i++){int edge=node*10+i;if(!book[edge]){book[edge]=true;dfs(edge%m);ans[l++]=i+'0';}}
}
char* crackSafe(int n, int k) {m=pow(10,n-1);memset(book,false,sizeof(book));memset(ans,0,sizeof(ans));kk=k;l=0;book[0]=true;dfs(0);for (int i=0;i<n;i++){ans[l++]='0';}return ans;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/589635.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全球范围内2nm晶圆厂建设加速

随着人工智能浪潮席卷而来&#xff0c;先进制程芯片的重要性日益凸显。当前&#xff0c;3nm工艺节点是行业内最先进的节点。与此同时&#xff0c;台积电、三星、英特尔、Rapidus等厂商正积极布局建设2nm晶圆厂。台积电与三星此前计划于2025年量产2nm芯片&#xff0c;而Rapidus则…

【Java】Thread详解

&#x1f352;前言 本文将从以下几方面来展开对Thread的介绍。 1.线程创建 2.线程中断 3.线程等待 4.线程休眠 在前面的文章中&#xff0c;已经总结了关于Thread的一些理解。 在阅读本文之前&#xff0c;最好对其有一些基础的了解。 文章链接: 【JavaSE】进程是什么&#xff1f…

基于lora技术微调Gemma(2B)代码实践

一、前置条件 获得模型访问权&#xff0c;选择Colab运行时&#xff0c;配置训练环境。 先在Kaggle上注册&#xff0c;然后获得Gemma 2B 的访问权&#xff1b; 然后在Google colab 配置环境&#xff0c;主要是GPU的选择&#xff0c;免费的是T4&#xff0c;建议采用付费的A100…

C++——list类及其模拟实现

前言&#xff1a;这篇文章我们继续进行C容器类的分享——list&#xff0c;也就是数据结构中的链表&#xff0c;而且是带头双向循环链表。 一.基本框架 namespace Mylist {template<class T>//定义节点struct ListNode{ListNode<T>* _next;ListNode<T>* _pre…

【重学C语言】三、C语言最简单的程序

【重学C语言】三、C语言最简单的程序 最简单的程序头文件使用尖括号 < >使用双引号 ""区别与注意事项示例 主函数认识三个错误 常量和变量常量ASCII 码表转义字符 关键字数据类型关键字存储类关键字修饰符关键字控制流程关键字函数相关关键字其他关键字 变量变…

Linux 恶意软件“Migo”针对 Redis 进行加密劫持攻击

安全研究人员遇到了一种新的加密劫持活动&#xff0c;该活动使用一种名为 Migo 的新恶意软件&#xff0c;该恶意软件针对 Linux 主机上的 Redis 服务器。在 Cado Security 研究人员注意到在野外利用 Redis 系统的新命令后&#xff0c;该活动曝光了。 初始访问 根据 Cado secu…

RUST语言基本数据类型认识

1.RUST的基本数据类型参考: 2.使用RUST数据类型声明变量并赋值: let a:i8=1;//8位有符号整数let a1:u8=2;//8位无符号整数let b:i16=1;//16位有符号整数let b1:u16=2;//16位无符号整数let c:i32=1;//32位有符号整数let c1:u32=2;//32位无符号整数let d:i64=1;//64位有符号整数l…

公众号爆文策略与实践:揭秘千万阅读量的秘密

1. 引言 介绍公众号爆文的重要性&#xff0c;以及分享个人通过每天投入半小时赚到30倍门票的经验。强调跟上大佬步伐&#xff0c;提升认知的重要性。 2. 爆文的底层逻辑 2.1 推荐的底层逻辑 内容分发机制的变化&#xff0c;从仅限于直接关注到通过搜索、浏览推荐等多种方式…

【项目实战经验】DataKit迁移MySQL到openGauss(上)

前言 本文将分享DataKit迁移MySQL到openGauss的项目实战&#xff0c;供广大openGauss爱好者参考。 1. 下载操作系统 https://www.openeuler.org/zh/download https://support.huawei.com/enterprise/zh/doc/EDOC1100332931/1a643956 https://support.huawei.com/enterprise…

封装一个vue3的公共组件

在Vue 3中&#xff0c;封装公共组件的场景包括但不限于以下几种情况&#xff1a; 重复使用的组件&#xff1a;如果你发现某个组件在多个地方重复使用&#xff0c;那么将其封装成公共组件是很有意义的。比如&#xff0c;页面中的各种表单控件&#xff08;输入框、下拉框、日期选…

硬件开发文档规范

本文出发点&#xff1a; 一般来说&#xff0c;越是大公司越注重开发文档的规范性&#xff0c;因为这样最大的好处是能够保证开发的连贯性&#xff0c;也就是即使有员工离职了&#xff0c;只要开发文档是齐全的&#xff0c;新员工入职后&#xff0c;就能够很快接手工作&#xf…

Linux驱动学习:从Linux主机nfs共享文件到uboot

第一步&#xff1a;在Linux主机上开启NFS服务&#xff0c;使用如下命令安装NFS服务&#xff1a; sudo apt-get install nfs-kernel-server rpcbind 第二步&#xff1a;创建一个文件夹用于共享&#xff0c;直接以nfs命名就行&#xff1a; 第三步&#xff1a;打开nfs服务配置文…