欧拉路径欧拉回路

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

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

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

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++){//不断遍历,直到这个顶点度数为0
		if (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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java解析实体类的属性和属性注释

前言 获取某个类的属性&#xff08;字段&#xff09;是我们经常都会碰到的&#xff0c;通常我们是通过反射来获取的。 但是有些特殊情况下&#xff0c;我们不仅要获取类的属性&#xff0c;还需要获取属性注释。这种情况下&#xff0c;我们只能通过注解去获取注释。可以自己定…

LC 111.二叉树的最小深度

111. 二叉树的最小深度 给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明&#xff1a; 叶子节点是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a; root [3,9,20,null,null,15,7] 输出&#xff1a;…

python读取excel,转换成json格式,for国际化前端菜单

# -*- coding: utf-8 -*-import pandas as pd import json# 读取Excel文件中的数据 excel_file rD:\解析excel\zy.xlsx df pd.read_excel(excel_file)# 生成中文JSON和英文JSON cn_data {} en_data {} pu_data {} special_data_cn {} special_data_en {} special_data_p…

肿瘤免疫反应瀑布图(源于The Miller Lab)

目录 数据格式 绘图 ①根据剂量 ②根据type ③根据治疗响应度 添加水平线 数据格式 肿瘤免疫响应数据 rm(list ls()) library(tidyverse) library(dplyr) library(knitr)#模拟数据 # We will randomly assign the two doses, 80 mg or 150 mg, to the 56 subjects Me…

使用 Docker 部署 Puter 云桌面系统

1&#xff09;Puter 介绍 :::info GitHub&#xff1a;https://github.com/HeyPuter/puter ::: Puter 是一个先进的开源桌面环境&#xff0c;运行在浏览器中&#xff0c;旨在具备丰富的功能、异常快速和高度可扩展性。它可以用于构建远程桌面环境&#xff0c;也可以作为云存储服…

【EI会议征稿】2024年智能计算、信号处理与计算机科学国际会议(ICSPCS 2024)

2024 International Conference on Intelligent Computing, Signal Processing and Computer Science (ICSPCS 2024) ●会议简介 2024年智能计算、信号处理与计算机科学国际会议&#xff08;ICSPCS 2024&#xff09;即将在青岛隆重开幕。本次会议将汇聚全球智能计算、信号处理…

【动态】江西省小型水库安全监测能力提升试点项目通过验收

近日&#xff0c;由北京国信华源科技有限公司和长江勘测规划设计研究有限责任公司联合承建的江西省小型水库安全监测能力提升试点项目圆满通过验收。 在项目业主单位的组织下&#xff0c;省项目部、特邀专家、县水利局二级项目部以及项目设计、监理、承建等单位的代表组成验收工…

C/C++后台研发需要点亮哪些技能树?

引言 在当今高速发展的信息技术领域&#xff0c;C/C作为底层性能卓越、灵活性强的语言&#xff0c;在后台开发中仍然占据着至关重要的地位&#xff0c;尤其是在高性能服务器、实时计算、嵌入式系统、游戏引擎及云计算基础设施等领域。成为一名优秀的C/C后台研发工程师&#xf…

200元预算可购买的阿里云服务器配置价格表

阿里云服务器租用价格表2024年最新&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元&#xff0c;ECS u1服务器2核4G5M固定带宽199元一年&#xff0c;2核4G4M带宽轻量服务器一年165元12个月&#xff0c;2核…

MySQL一条SQL语句的执行过程

MySQL一条SQL语句的执行过程可以大致分为以下几个步骤&#xff1a; mysq分层架构 为了理解这个问题&#xff0c;先从Mysql的架构说起&#xff0c;对于Mysql来说&#xff0c;大致可以分为3层架构。 网络连接层&#xff1a; 作为客户端和服务端的连接&#xff0c;连接器负责处…

共享单车安全保障利器,实名认证API名副其实!

&#x1f680; 引言 随着科技飞速跃进&#xff0c;共享单车已成为都市新宠儿, 为我们的生活带来方便的同时&#xff0c;一系列安全隐患也相伴而生: 公共资产需要大众守护&#xff0c;但有人却恶意损毁、任性挪用&#xff1b;让人揪心的现象愈发严重&#xff0c;是时候采取雷霆…

WHM面板安全设置与防护技巧

上周有一个Hostease的客户购买带WHM面板的服务器&#xff0c;咨询我们的在线客服&#xff0c;如何确保WHM面板的安全性&#xff0c;客户想要进行安全加固设置。可以尝试以下是一些WHM面板的安全设置和防护技巧&#xff1a; 定期更新软件和补丁&#xff1a;确保操作系统、WHM面…

实操:driver.js 实现产品导览、亮点、上下文帮助

官网 https://driverjs.com/ 依赖 <script src"https://cdn.jsdelivr.net/npm/driver.js1.0.1/dist/driver.js.iife.js"></script> <link rel"stylesheet" href"https://cdn.jsdelivr.net/npm/driver.js1.0.1/dist/driver.css"/…

算法基础 - 并查集

&#x1f3e0;个人主页&#xff1a;尘觉主页 文章目录 算法 - 并查集前言Quick FindQuick Union加权 Quick Union路径压缩的加权 Quick Union比较&#x1f604;总结 算法 - 并查集 前言 用于解决动态连通性问题&#xff0c;能动态连接两个点&#xff0c;并且判断两个点是否连…

一个问题串联 Java 的几个基础知识

前言 关于 “” 和 equals() 的区别这个问题&#xff0c;我之前一直搞的很乱&#xff0c;虽然面试的时候一直没有被问到&#xff0c;但是我感觉这种是属于最基础的知识&#xff0c;如果不懂好像不是很好。后来我发现通过这个问题&#xff0c;可以串联起很多的知识点&#xff0…

使用Bitmaps位图实现Redis签到

系列文章目录 文章目录 系列文章目录前言前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 Redis提供了Bitmaps这个“数据类型”可以实现对位的操作: (1) Bitmaps…

定时器与晶振时钟、中断系统、定时中断

定时器 简介&#xff1a; C51中的定时器和计数器是同一个硬件电路支持的&#xff0c;通过寄存器配置不同&#xff0c;就可以将他当做定时器 或者计数器使用。 确切的说&#xff0c;定时器和计数器区别是致使他们背后的计数存储器加1的信号不同。当配置为定时器使用时&#xff0…

求批量修改图片扩展名有哪些方法?一键批量修改文件扩展名

批量修改图片的扩展名还可以帮助我们更好地管理和分类图片。在日常生活和工作中&#xff0c;我们可能会收集大量的图片&#xff0c;这些图片可能来自不同的来源&#xff0c;具有不同的格式和特点。通过批量修改扩展名&#xff0c;我们可以将这些图片进行统一的管理和分类&#…

【JAVASE】学习类与对象的创建和实例化

✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;再无B&#xff5e;U&#xff5e;G-CSDN博客 目标&#xff1a; 1. 掌握类的定义方式以及对象的实例化 2. …

视觉大模型--deter的深入理解

但对于transformer用于目标检测领域的开创性模型&#xff0c;该模型言简意赅&#xff0c;但是但从论文理解&#xff0c;有很多细节都不清楚&#xff0c;尤其是解码器的query和二分图匹配(Bipartite Matching)和匈牙利算法(Hungarian Algorithm)相关&#xff0c;本文将根据代码详…