歐拉回路和歐拉通路


據說流經哥尼斯堡的普雷格爾河中有兩個島,兩個島與兩岸共4處陸地通過7座楊 彼此相聯,當地居民們熱衷於一個難題:是否存在一條路線,可以不重復地走遍7座橋,這就是著名的七橋問題。

它由歐拉首先提出並給出了完美的解答。

用圖論的語言轉換為

不難發現,歐拉道路中,出和入是對應的——除了起點和終點外,其他點的進出次數應該相同(即除終點和起點外,其他點的度應該是偶數)但是在七橋問題中,四個點的度都是奇數,這樣的點被稱為奇點,

因此七橋問題不存在歐拉道路。上述條件也是充分條件——如果一個無向圖是連通的,且最多只有兩個奇點,則必須從其中一個奇點出發,另一個奇點終止;如果奇點不存在,則可以從任意點出發,最終一定會回到終點。

由此也能推出有向圖的結論:最多只能有兩個點的入度不等於出度,而且必須是其中一個點的出度恰好比入度大1(把它作為起點),另一個的入度比出度大一(作為終點),或者每個點入度等於出度,還有一個前提條件:在忽略邊的方向后,圖必須是連通的。

歐拉通路與歐拉回路意義並不相同,歐拉回路要能夠回到起點

 無向圖是否具有歐拉通路或回路的判定:

歐拉通路:圖連通;圖中只有0個或2個度為奇數的節點

歐拉回路:圖連通;圖中所有節點度均為偶數

 有向圖是否具有歐拉通路或回路的判定:

歐拉通路:圖連通;除2個端點外其余節點入度=出度;1個端點入度比出度大1;一個端點入度比出度小1 或 所有節點入度等於出度

歐拉回路:圖連通;所有節點入度等於出度

那做道題應用下學到的新知識吧

HDU 1878 歐拉回路(並查集+歐拉回路)

#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <iostream>
#include <cstdlib>
#include <set>
#include <vector>
#include <cctype>
#include <iomanip>
#include <sstream>
#include <climits>
#include <queue>
#include <stack>
using namespace std;
typedef long long ll;
#define INF 0X3f3f3f3f
const ll MAXN = 1e3 + 7;
const ll MOD = 1e9 + 7;
int pre[MAXN]; 
int n, m; int degree[MAXN]; int find(int x) //查找根結點 { int r = x; while (r != pre[r]) //尋找根結點 r = pre[r]; int i = x, j; while (pre[i] != r) //路徑壓縮 { j = pre[i]; pre[i] = r; i = j; } return r; } int main() { ios::sync_with_stdio(false); while (cin >> n && n) { cin >> m; memset(degree, 0, sizeof(degree)); for (int i = 1; i <= n; i++) pre[i] = i; while (m--) { int a, b; cin >> a >> b; int fa = find(a); int fb = find(b); if (fa != fb) { pre[a] = b; degree[a]++; degree[b]++; } } int flag = 1; for (int i = 2; i <= n; i++) { if (degree[i] & 1 || pre[i] != pre[1]) { flag = 0; break; } } cout << flag << endl; } return 0; }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM