據說流經哥尼斯堡的普雷格爾河中有兩個島,兩個島與兩岸共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; }