歐拉回路歐拉路【詳解】

1.引入

2.概念

3.解決方法

4.例題

5.回顧

1.引入

經典的七橋問題

哥尼斯堡是位于普累格河上的一座城市,它包含兩個島嶼及連接它們的七座橋,如下圖所示。

可否走過這樣的七座橋,而且每橋只走過一次?

你怎樣證明?

后來大數學家歐拉把它轉化成一個幾何問題——一筆畫問題。

我們的大數學家歐拉,找到了它的重要條件

1.奇點的數目不是0個就是2個

奇點:就是度為奇數(有向圖是判斷出度與入度是否相等),反之為偶點

有向圖1、連通 2、所有點出度等于入度或者一個點入度-出度=1,另外一個點出度-入度=1

2.圖是聯通的

2.概念

歐拉路:對于一個圖,每條邊可以且只能訪問一次

歐拉回路:在歐拉圖的情況下,最后要回到原點。也就是說歐拉路不一定是歐拉回路,但歐拉回路一定是歐拉路

3.解決方法:
1.dfs

第一步:判斷圖是否連通

第二步:判斷奇點個數

很簡單,但是使用dfs的話,就需要很多數組,并且用鄰接矩陣是最方便的,所以費空間

2.并查集

分為G1和G2兩個集合,G1表示已經聯通的,G2表示未聯通的

利用父親表示法合并集合效率最高,也是上面那兩步

4.例題

(1)

一筆畫問題

題目描述

如果一個無向圖存在一筆畫,則一筆畫的路徑叫做歐拉路,如果最后又回到起點,那這個路徑叫做歐拉回路。

輸入

第一行n,m,0 < n <=20,表示有n個點,m條邊,以下m行描述每條邊連接的兩點。

輸出

如果有歐拉路或歐拉回路,輸出一條路徑即可,頂點之間由空格隔開。

如果沒有,輸出NO
?

樣例輸入1

5?5
1?2
2?3
3?4
4?5
5?1

樣例輸出1

1?5?4?3?2?1

解法

1.dfs

簡單,實用

費空間費時間

2.并查集

效率高,快速,不費時間不費空間

難,費勁

本蒟蒻用的是DFS

1、判斷連通性,沒有判斷
就是要判斷所有點都是連通的(dfs或者并查集)
如果不連通輸出NO

2、如果連通,統計奇點的個數
如果奇點個數為0則為歐拉回路
如果奇點個數為2則為歐拉路
其他情況則輸出NO

3、輸出一個路徑

dfs:

void dfs(int i)
{for(int j=1;j<=n;j++){if(g[i][j]==1){g[i][j]=0;g[j][i]=0;dfs(j);}}c[++reckon]=i;return;
}

調題過程很坎坷

40分:(未判斷NO)

#include<bits/stdc++.h>
using namespace std;
#define N 510
int g[N][N],d[N],c[N],n,m,p;
int dfs(int i)
{int j;for(j=1;j<=n;j++){if(g[i][j]==1){g[i][j]=0;g[j][i]=0;dfs(j);}}c[++p]=i;return 0;
}int main()
{cin>>n>>m;int x,y;memset(g,0,sizeof(g));for(int i=1;i<=m;i++){cin>>x>>y;g[x][y]=1;g[y][x]=1;d[x]++;d[y]++;}int z=1;for(int i=1;i<=n;i++){if(d[i]%2==1){z=i;}}dfs(z);for(int i=1;i<=p;i++){cout<<c[i]<<" ";}return 0;
}//40分

60分:(未判斷連通性)

#include<bits/stdc++.h>
using namespace std;
#define N 510
int g[N][N],d[N],c[N],n,m,reckon,oddity_point;
void dfs(int i)
{for(int j=1;j<=n;j++){if(g[i][j]==1){g[i][j]=0;g[j][i]=0;dfs(j);}}c[++reckon]=i;return;
}int main()
{cin>>n>>m;int x,y;memset(g,0,sizeof(g));for(int i=1;i<=m;i++){cin>>x>>y;g[x][y]=1;g[y][x]=1;d[x]++;d[y]++;}int z=1;for(int i=1;i<=n;i++){if(d[i]%2==1){z=i;oddity_point++;}}dfs(z);if(oddity_point!=2&&oddity_point!=0){cout<<"NO";return 0;}for(int i=1;i<=reckon;i++){cout<<c[i]<<" ";}return 0;
}//60分

100分AC:

#include<bits/stdc++.h>
using namespace std;
#define N 510
int g[N][N],d[N],c[N],n,m,reckon,oddity_point,lt;
void dfs(int i)
{for(int j=1;j<=n;j++){if(g[i][j]==1){g[i][j]=0;g[j][i]=0;dfs(j);}}c[++reckon]=i;return;
}int main()
{cin>>n>>m;int x,y;memset(g,0,sizeof(g));for(int i=1;i<=m;i++){cin>>x>>y;g[x][y]=1;g[y][x]=1;d[x]++;d[y]++;}int z=1;for(int i=1;i<=n;i++){if(d[i]%2==1){z=i;oddity_point++;}if(d[i]==0){lt++;}}dfs(z);if(oddity_point!=2&&oddity_point!=0){cout<<"NO";return 0;}if(lt!=0){cout<<"NO";return 0;}for(int i=1;i<=reckon;i++){cout<<c[i]<<" ";}return 0;
}//AC

5.回顧

因為我的測試點沒有測出來問題所在:

問題:

如果1-2-3-4四個點一個環,5-6兩個點連通,奇點個數為2,但整個圖不連通

我的程序會說YES

可是根本不連通

輸出5 6

碰上這樣的就必須用DFS,并查集了

本蒟蒻偷了個小懶

因為碰上這樣的(錯誤)輸出一定不會是m+1個

所以判斷一下輸出個數是不是不等于m+1

如果不等于,輸出NO。

#include<bits/stdc++.h>
using namespace std;
#define N 510
int g[N][N],d[N],c[N],n,m,reckon,oddity_point,lt;
void dfs(int i)
{for(int j=1;j<=n;j++){if(g[i][j]==1){g[i][j]=0;g[j][i]=0;dfs(j);}}c[++reckon]=i;return;
}
int main()
{cin>>n>>m;int x,y;memset(g,0,sizeof(g));for(int i=1;i<=m;i++){cin>>x>>y;g[x][y]=1;g[y][x]=1;d[x]++;d[y]++;}int z=1;for(int i=1;i<=n;i++){if(d[i]%2==1){z=i;oddity_point++;}if(d[i]==0){lt++;}}dfs(z);if(oddity_point!=2&&oddity_point!=0){cout<<"NO";return 0;}if(lt!=0){cout<<"NO";return 0;}if(reckon!=m+1){cout<<"NO";return 0;}for(int i=1;i<=reckon;i++){cout<<c[i]<<" ";}return 0;
}

最終,我們把無用的代碼段刪掉,調試結束

#include<bits/stdc++.h>
using namespace std;
#define N 510
int g[N][N],d[N],c[N],n,m,reckon,oddity_point,lt;
void dfs(int i)
{for(int j=1;j<=n;j++){if(g[i][j]==1){g[i][j]=0;g[j][i]=0;dfs(j);}}c[++reckon]=i;return;
}
int main()
{cin>>n>>m;int x,y;memset(g,0,sizeof(g));for(int i=1;i<=m;i++){cin>>x>>y;g[x][y]=1;g[y][x]=1;d[x]++;d[y]++;}int z=1;for(int i=1;i<=n;i++){if(d[i]%2==1){z=i;oddity_point++;}}dfs(z);//判斷連通性if(reckon!=m+1){cout<<"NO";return 0;}//判斷奇點個數if(oddity_point!=2&&oddity_point!=0){cout<<"NO";return 0;}for(int i=1;i<=reckon;i++){cout<<c[i]<<" ";}return 0;
}

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

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

相關文章

【Linux top命令】

文章目錄 深入了解Linux top命令&#xff1a;實時監控系統性能1. 什么是top命令&#xff1f;2. 使用top命令3. top命令交互操作 深入了解Linux top命令&#xff1a;實時監控系統性能 1. 什么是top命令&#xff1f; top命令是一個用于實時監控系統性能的文本界面工具。它顯示當…

Linux上使用獨立顯卡Tesla T4(測試視頻壓縮)

背景 將視頻處理程序單獨部署至K8S之外&#xff0c;使用獨立GPU顯卡的一臺服務器上。 需事先對GPU性能做簡單測試。 已通過zabbix對Linux進行了系統資源監控。 已通過PrometheusGrafana對顯卡Tesla T4做了性能監控。 逐步補充&#xff0c;稍等 2023年12月6日 操作 查看當前…

鴻蒙Harmony開發初探

一、背景 9月25日華為秋季全場景新品發布會&#xff0c;余承東宣布鴻蒙HarmonyOS NEXT蓄勢待發&#xff0c;不再支持安卓應用。網易有道、同程旅行、美團、國航、阿里等公司先后宣布啟動鴻蒙原生應用開發工作。 二、鴻蒙Next介紹 HarmonyOS是一款面向萬物互聯&#xff0c;全…

[Linux] 基于LAMP架構安裝論壇

一、安裝Discuz論壇 1.1 創建數據庫&#xff0c;并進行授權 mysql -u root -p123CREATE DATABASE bbs; #創建一個數據庫GRANT all ON bbs.* TO bbsuser% IDENTIFIED BY admin123; #把bbs數據庫里面所有表的權限授予給bbsuser,并設置密碼admin123flush privileges; #刷新數據庫…

Java 中的抽象類與接口:深入理解與應用

文章目錄 什么是抽象類&#xff1f;什么是接口&#xff1f;抽象類和接口的使用場景抽象類和接口的區別結論 在 Java 編程語言中&#xff0c;抽象類和接口是兩種重要的機制&#xff0c;用于實現抽象化和多態性。這兩種機制都允許我們定義一種通用的類型&#xff0c;然后通過繼承…

數據結構——棧與棧排序

棧的特性 棧是一種遵循后進先出&#xff08;LIFO&#xff09;原則的數據結構。其基本操作包括&#xff1a; push&#xff1a;將元素添加到棧頂。pop&#xff1a;移除棧頂元素。peek&#xff1a;查看棧頂元素&#xff0c;但不移除。 棧排序的原理 棧排序的核心是使用兩個棧&…

[滲透測試學習] Devvortex - HackTheBox

文章目錄 信息搜集解題步驟提交flag 信息搜集 掃描端口 nmap -sV -sC -p- -v --min-rate 1000 10.10.11.242發現80端口有http服務&#xff0c;并且是nginx服務 嘗試訪問web界面&#xff0c;發現跳轉到http://devvortex.htb/無法訪問 我們用vim添加該域名即可 sudo vim /etc/…

J.408之數據結構

J-408之數據結構_北京信息科技大學第十五屆程序設計競賽&#xff08;同步賽&#xff09; (nowcoder.com) 思維好題&#xff0c;直接用兩個set存沒出現的數字就好了 // Problem: 408之數據結構 // Contest: NowCoder // URL: https://ac.nowcoder.com/acm/contest/68572/J // Me…

ClickHouse安裝和部署

ClickHouse安裝過程&#xff1a; ClickHouse支持運行在主流64位CPU架構&#xff08;X86、AArch和PowerPC&#xff09;的Linux操作 系統之上&#xff0c;可以通過源碼編譯、預編譯壓縮包、Docker鏡像和RPM等多種方法進行安裝。由于篇幅有限&#xff0c;本節著重講解離線RPM的安…

RAW和YUV的區別

RAW是指未經過任何壓縮或處理的原始圖像數據。在攝像頭中&#xff0c;原始圖像數據可以是來自圖像傳感器的未經處理的像素值。這些原始數據通常以一種Bayer模式的形式存在&#xff0c;其中每個像素僅包含一種顏色信息&#xff08;紅色、綠色或藍色&#xff09;&#xff0c;需要…

【開源】基于Vue和SpringBoot的在線課程教學系統

項目編號&#xff1a; S 014 &#xff0c;文末獲取源碼。 \color{red}{項目編號&#xff1a;S014&#xff0c;文末獲取源碼。} 項目編號&#xff1a;S014&#xff0c;文末獲取源碼。 目錄 一、摘要1.1 系統介紹1.2 項目錄屏 二、研究內容2.1 課程類型管理模塊2.2 課程管理模塊2…

Redis Bitmaps 數據結構模型位操作

Bitmaps 數據結構模型 Bitmap 本身不是一種數據結構&#xff0c;實際上它就是字符串&#xff0c;但是它可以對字符串的位進行操作。 比如 “abc” 對應的 ASCII 碼分別是 97、98、99。對應的二進制分別是 01100010、01100010、01100011, 如下所示&#xff1a; a b …

HTML5+CSS3+JS小實例:文字依次點擊驗證

實例:文字依次點擊驗證 技術棧:HTML+CSS+JS 效果: 源碼: 【HTML】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" content=&quo…

十七、FreeRTOS之FreeRTOS事件標志組

本節需要掌握以下內容&#xff1a; 1&#xff0c;事件標志組簡介&#xff08;了解&#xff09; 2&#xff0c;事件標志組相關API函數介紹&#xff08;熟悉&#xff09; 3&#xff0c;事件標志組實驗&#xff08;掌握&#xff09; 4&#xff0c;課堂總結&#xff08;掌握&am…

04_W5500_TCP_Server

上一節我們完成了TCP_Client實驗&#xff0c;這節使用W5500作為服務端與TCP客戶端進行通信。 目錄 1.W5500服務端要做的&#xff1a; 2.代碼分析&#xff1a; 3.測試&#xff1a; 1.W5500服務端要做的&#xff1a; 服務端只需要打開socket&#xff0c;然后監聽端口即可。 2…

基于Spring Boot的水產養殖管理系統

文章目錄 項目介紹主要功能截圖:部分代碼展示設計總結項目獲取方式?? 作者主頁:超級無敵暴龍戰士塔塔開 ?? 簡介:Java領域優質創作者??、 簡歷模板、學習資料、面試題庫【關注我,都給你】 ??文末獲取源碼聯系?? 項目介紹 基于Spring Boot的水產養殖管理系統,jav…

HarmonyOS Developer——鴻蒙【構建第一個JS應用(FA模型)】

創建JS工程 JS工程目錄結構 構建第一個頁面 構建第二個頁面 實現頁面間的跳轉 使用真機運行應用 說明 為確保運行效果&#xff0c;本文以使用DevEco Studio 3.1 Release版本為例&#xff0c;點擊此處獲取下載鏈接。 創建JS工程 若首次打開DevEco Studio&#xff0c;請點擊…

蝦皮什么商品好賣

在蝦皮&#xff08;Shopee&#xff09;平臺上&#xff0c;有許多商品類別都表現出了較好的銷售情況。然而&#xff0c;隨著時間和地區的變化&#xff0c;熱銷商品也會有所不同。本文將介紹一些在蝦皮平臺上表現較好的商品類別&#xff0c;并提供一些建議&#xff0c;幫助您在蝦…

交換機基本原理和配置

目錄 一、數據鏈路層功能 二、交換機的工作原理 三、交換機的四大功能 一、數據鏈路層功能 位于網絡層與物理層之間 數據鏈路的建立、維護與拆除幀包裝、幀傳輸、幀同步幀的差錯恢復流量控制 二、交換機的工作原理 交換機通過數據幀的源 MAC 地址&#xff0c;學習到交換機端…

偶數位字符前置算法

題目描述&#xff1a; 題目描述 編寫函數void myshift(char *s),在不打亂s原本相對位置情況下&#xff0c;將偶數位上的字符全部挪到奇數位字符的前面。輸入格式 輸入一個字符串 s保證輸入字符串 s 的長度大于等于1小于等于100輸出格式 輸出修改后的字符串 s。輸入樣例1 01234…