歐拉回路(Eulerian Path)

1.定義

如果圖 G G G(有向圖或者無向圖)中所有邊一次僅且一次行遍所有頂點的通路稱作歐拉通路。

如果圖 G G G中所有邊一次僅且一次行遍所有頂點的回路稱作歐拉回路。

具有歐拉回路的圖成為歐拉圖(簡稱 E E E圖)。具有歐拉通路但不具有歐拉回路的圖成為半歐拉圖。
頂點可以經過多次
畫個圖分辨一下:

  • 歐拉通路:
    image
  • 歐拉回路
    image
    簡單來講就是歐拉通路能夠從起點到終點,歐拉回路能夠回到起點

2.定理及推論

歐拉通路和歐拉回路的判定是很簡單的
無向圖 G G G存在歐拉通路的充要條件是:
G G G為連通圖,并且 G G G僅有兩個奇度節點(度數為奇數的頂點)或者無奇度節點
推論1:

  1. G G G是僅有兩個奇度節點的連通圖時, G G G的歐拉通路必以此兩個節點為端點
  2. G G G是無奇度節點的連通圖時, G G G必有歐拉回路
  3. G G G為歐拉圖(存在歐拉回路)的充分必要條件是 G G G為無奇度節點的連通圖

有向圖 D D D存在歐拉通路的充要條件是:
D D D為有向圖, D D D的基圖聯通,并且所有頂點的出度與入度都相等;或者除兩個頂點外,其余頂點的出度與入度都相等,而在這兩個頂點中一個頂點的出度與入度只為 1 1 1,另一個頂點的出度與入度之差為 ? 1 ?1 ?1
推論2:

  1. 當 D 除出、入度之差為 1 , ? 1 的兩個頂點之外,其余頂點的出度與入度都相等時, D 的有向歐拉通路必以出、入度之差為 1 的頂點作為始點,以出、入度之差為 ? 1 的頂點作為終點 當D除出、入度之差為1,?1的兩個頂點之外,其余頂點的出度與入度都相等時,D的有向歐拉通路必以出、入度之差為1的頂點作為始點,以出、入度之差為?1的頂點作為終點 D除出、入度之差為1?1的兩個頂點之外,其余頂點的出度與入度都相等時,D的有向歐拉通路必以出、入度之差為1的頂點作為始點,以出、入度之差為?1的頂點作為終點
  2. 當 D 的所有頂點的出、入度都相等時, D 中存在有向歐拉回路 當D的所有頂點的出、入度都相等時,D中存在有向歐拉回路 D的所有頂點的出、入度都相等時,D中存在有向歐拉回路
  3. 有向圖 D 為有向歐拉圖的充分必要條件是 D 的基圖為連通圖,并且所有的頂點的出、入度都相等 有向圖D為有向歐拉圖的充分必要條件是D的基圖為連通圖,并且所有的頂點的出、入度都相等 有向圖D為有向歐拉圖的充分必要條件是D的基圖為連通圖,并且所有的頂點的出、入度都相等

3.歐拉通路回路存在的判斷

根據定理和推論,我們可以很好的找到歐拉通路回路的判斷方法

A.判斷歐拉通路是否存在的方法#

  • 有向圖:圖連通,有一個頂點出度大于入度 1 ,有一個頂點入度大于出度 1 ,其余都是出度 = 入度 有向圖:圖連通,有一個頂點出度大于入度1,有一個頂點入度大于出度1,其余都是出度=入度 有向圖:圖連通,有一個頂點出度大于入度1,有一個頂點入度大于出度1,其余都是出度=入度
  • 無向圖:圖聯通,只有兩個頂點是奇數度,其余都是偶數度

B.判斷歐拉回路是否存在的方法

  • 有向圖:圖聯通,所有的頂點出度=入度
  • 無向圖:圖聯通,所有的頂點都是偶數度

4.歐拉回路的應用

  1. 哥尼斯堡七橋問題
  2. 一筆畫問題
  3. 旋轉鼓輪的設計

5.歐拉回路的判斷

D F S DFS DFS

鄰接矩陣的時間復雜度為 O ( n 2 ) O(n^2) O(n2)
鄰接表的時間復雜度為 O ( n + e ) O(n+e) O(n+e)
如果,重邊太多的話,鄰接表會掛掉:)

請看這篇文章

6.歐拉回路的求解

板子題:騎馬修柵欄
傳送門
題目保證有解。

A.DFS搜索求解歐拉回路

基本思路:利用歐拉定理判斷出一個圖存在歐拉回路或歐拉通路后,選擇一個正確的起始頂點,用DFS算法遍歷所有的邊(每條邊只遍歷一次),遇到走不通就回退。在搜索前進方向上將遍歷過的邊按順序記錄下來。這組邊的排列就組成了一條歐拉通路或回路。

#include <bits/stdc++.h>
using namespace std;
int bian[510],n,m,ans[510];
int mapp[510][510],c=0;
void dfs(int j){for(int i=1;i<=n;i++){if(mapp[j][i]>0){mapp[i][j]--;mapp[j][i]--;dfs(i);}}ans[c++]=j;
}
int main(){cin>>m;int a,b;for(int i=0;i<m;i++){cin>>a>>b;mapp[a][b]++;mapp[b][a]++;bian[a]++;bian[b]++;n=a>n?a:n;n=b>n?b:n;}int flag=1;for(int i=n;i>=1;i--){if(bian[i]%2==1){flag=i;}}dfs(flag);for(int i=c-1;i>=0;i--){cout<<ans[i]<<endl;}
}

B.Fleury(佛羅萊)算法

  • Fleury算法是對DFS爆搜的一種改進,使用DFS漫不經心的隨意走效率是不高的,Fleury是一種有效的算法
    ps:其實我也不會,這里就只介紹一下吧
    image
    我個人感覺是把大連通塊分成了零散的幾個小連通塊然后分塊連接
    關鍵是能不走橋就不走橋,實在無路可走了才會去走橋
    代碼就不給了,估計給了也是錯的

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/717776.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/717776.shtml
英文地址,請注明出處:http://en.pswp.cn/news/717776.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Linux】Linux常用指令介紹

目錄 1、whoami命令 2、pwd命令 3、ls命令 4、cd命令 5、touch命令 6、mkdir命令 7、rm命令 8、man命令 9、cp命令 10、mv命令 11、cat命令 12、more命令 13、less命令 14、head命令 15、tail命令 16、find命令 1、whoami命令 語法&#xff1a;whoani 功能&a…

SpringMVC--03--前端傳數組給后臺

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 案例1乘客個人信息方法1&#xff1a;表單提交&#xff0c;以字段數組接收方法2&#xff1a;表單提交&#xff0c;以BeanListModel接收方法3&#xff1a;將Json對象序…

leetcode移除元素

注意&#xff0c;在本題中&#xff0c;是對原數組進行操作&#xff0c;需要原地刪除指定元素&#xff0c;所以我們可以采用快慢指針來操作。 顧名思義&#xff0c;快慢指針是有兩個指針&#xff0c;一直快指針&#xff0c;一個慢指針。在本題中&#xff0c;快慢指針起點都是0&a…

解鎖人體姿態的秘密:部件親和場(PAF)的革新應用

部件親和場(PAF)原理及其在人體姿態估計中的應用 摘要: 隨著人工智能技術的發展,人體姿態估計在計算機視覺領域受到越來越多的關注。部件親和場(Part Affinity Fields,簡稱PAF)作為一種新興的人體姿態估計技術,通過構建2D向量場來描述人體肢體的方向和位置信息,從而…

Matlab 機器人工具箱 運動學

文章目錄 R.fkine()R.ikine()R.ikine6s()R.ikuncR.jacob0、R.jacobn、R.jacob_dotjtrajctraj參考鏈接 官網&#xff1a;Robotics Toolbox - Peter Corke R.fkine() 正運動學&#xff0c;根據關節坐標求末端執行器位姿 mdl_puma560; % 加載puma560模型 qz % 零角度 qr …

繼承(使用及深入、super、重寫/復寫)--學習JavaEE的day14

day14 一、繼承 概念 Java中的繼承是一個對象獲取父對象的所有屬性和行為的機制 理解&#xff1a;繼承是指一個類(子類)可以繼承另一個類(父類)的屬性和方法 關鍵字extends 優點&#xff1a;減少代碼的冗余 缺點&#xff1a;繼承會增加類與類之間的關系&#xff0c;會增加代碼…

[Unity3d] 網絡開發基礎【個人復習筆記/有不足之處歡迎斧正/侵刪】

TCP/IP TCP/IP協議是一 系列規則(協議)的統稱&#xff0c;他們定義了消息在網絡間進行傳輸的規則 是供已連接互聯網的設備進行通信的通信規則 OSI模型只是一個基本概念,而TCP/IP協議是基于這個概念的具體實現 TCP和UDP協議 TCP:傳輸控制協議&#xff0c;面向連接&#xff0c…

VsCode配置PCL、Open3D自動補全

寫在前面 本文內容 在VsCode上開發PCL、Open3D相關代碼&#xff0c;代碼自動補全 Open3D、PCL的安裝使用見各個版本的Open3D、PCL的編譯、使用教程 平臺/環境 windows11(windows10): visual studio 2022&#xff1b;cmake 3.22; VsCode 通過cmake構建項目&#xff1b; 轉載請…

Excel MATCH函數 兩張順序不同表格,統一排序

目錄 一. 背景二. 添加輔助列,使用MATCH函數生成排序條件三. 效果 一. 背景 有如下圖所示的兩張表格&#xff0c;分別記錄著同一批人的1月份和2月份的工資。表格A和表格B中的姓名列相同&#xff0c;工資列數據不同現在要求參考表格A中的姓名列對表格B中的數據進行排序&#xf…

C語言:預處理

C語言&#xff1a;預處理 預定義符號#define定義常量定義宏宏與函數對比 #操作符##操作符條件編譯頭文件包含庫文件包含本地文件包含嵌套文件包含 預定義符號 C語?設置了?些預定義符號&#xff0c;可以直接使?&#xff0c;預定義符號也是在預處理期間處理的。 __FILE__ //…

多智能體強化學習簡介

基礎概念 什么是多智能體系統 多智能體系統&#xff08;Multi-Agent System&#xff0c;MAS&#xff09;是由多個自主智能體組成的系統。這些智能體可以協同工作&#xff0c;也可以獨立行動&#xff0c;以實現各自的目標。在多智能體系統中&#xff0c;每個智能體都有自己的決…

在你的 Vue + Electron 項目里,引入 ESLint

因為我的項目是基于 Electron 平臺的 Web 應用&#xff0c;使用 Vue 3 實現&#xff0c;而且用了 TypeScript&#xff0c;所以&#xff0c;在引入 ESLint 的時候&#xff0c;要考慮好幾種規范的問題。 文章目錄 零、簡介1. 規則2. 配置文件3. 共享配置4. 插件5. 解析器6. 自定義…

Vue開發實例(九)動態路由實現左側菜單導航

之前在【Vue開發實例&#xff08;六&#xff09;實現左側菜單導航】文中實現了菜單的導航&#xff0c;本篇是在那個基礎上改造的。 動態路由實現左側菜單導航 一、動態菜單創建二、根據菜單數據來創建路由三、添加路由已加載標記&#xff0c;省的每次點擊菜單都要加載 一、動態…

2021 年 3 月青少年軟編等考 C 語言一級真題解析

目錄 T1. 字符菱形思路分析 T2. 與圓相關的計算思路分析 T3. 蘋果和蟲子 2思路分析 T4. 奇數求和思路分析 T5. 藥房管理思路分析 T1. 字符菱形 給定一個字符&#xff0c;用它構造一個對角線長 5 5 5 個字符&#xff0c;傾斜放置的菱形。 時間限制&#xff1a;1 s 內存限制&a…

3、云原生安全之falco的部署

文章目錄 1、helm安裝2、拉去鏡像失敗與解決3、安裝faclo4、安裝nfs服務器,配置k8s的持久卷4.1、創建nfs服務器,4.2、部署master節點(nsf服務的客戶端)4.3、pv與pvc4.4、假設pv和pvc的配置文件出錯了5、安裝falcosidekick可視化(建議跳過,直接使用6)6、安裝faclo與falco…

【設計模式 01】單例模式

單例模式&#xff0c;是一種創建型設計模式&#xff0c;他的核心思想是保證一個類只有一個實例&#xff08;即&#xff0c;在整個應用程序中&#xff0c;只存在該類的一個實例對象&#xff0c;而不是創建多個相同類型的對象&#xff09;&#xff0c;并提供一個全局訪問點來訪問…

java012 - Java集合基礎

1、集合基礎 1.1 集合概述 引用數據類型包括&#xff1a;類、接口、數組[] 1.2 ArrayList構造和添加方法 代碼&#xff1a; 空集合對象&#xff1a;[] add() add(int index,E element): 1.3 ArrayList集合常用方法

計算機體系結構安全:對體系結構如何支持安全機制進行調研

一、體系結構支持信任建立和主動防御的技術&#xff1a; 可信3.0 二、體系結構怎么更好的支持信任建立和主動防御 2.1 支持信任建立 一、以手機芯片舉例&#xff0c;用智能手機的芯片作為信任根&#xff0c;確保應用程序和敏感數據受到保護。 二、啟動時驗證操作系統和應用…

Stable Diffusion 模型分享:Henmix_Real(人像、真實、寫真、亞洲面孔)

本文收錄于《AI繪畫從入門到精通》專欄,專欄總目錄:點這里。 文章目錄 模型介紹生成案例案例一案例二案例三案例四案例五案例六案例七案例八下載地址模型介紹 作者述:這個模型試圖改

深入理解算法的空間復雜度

算法一&#xff1a;逐步遞增型 void Loveyou(int n)//n為問題規模 {int i1;while(i<n){i;printf("I love you %d\n",i);}printf("I love you more than %d\n",n);//5 } int main() {Loveyou(3000);return 0; } 無論問題規模怎么變&#xff0c;算法運行…