哥尼斯堡的「七橋問題」

2021-09-13 13:32:32 字數 1339 閱讀 4570

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

可否走過這樣的七座橋,而且每橋只走過一次?瑞士數學家尤拉(leonhard euler,1707—1783)最終解決了這個問題,並由此創立了拓撲學。

這個問題如今可以描述為判斷尤拉迴路是否存在的問題。尤拉迴路是指不令筆離開紙面,可畫過圖中每條邊僅一次,且可以回到起點的一條迴路。現給定乙個無向圖,問是否存在尤拉迴路?

輸入第一行給出兩個正整數,分別是節點數n (1≤n≤1000)和邊數m;隨後的m行對應m條邊,每行給出一對正整數,分別是該條邊直接連通的兩個節點的編號(節點從1到n編號)。

若尤拉迴路存在則輸出1,否則輸出0。

6 10

1 22 3

3 14 5

5 66 4

1 41 6

3 43 6

1
5 8

1 21 3

2 32 4

2 55 3

5 43 4

0
經典的並查集求解。並查集陣列pre用來存放每個元素的父結點(初始化為-1),利用並查集搜尋來查詢老祖宗,當老祖宗僅有乙個且奇數點(與其他點有奇數個連線)不存在時,說明這是乙個尤拉迴路。

#include using namespace std;

#define maxsize 10005

vectorv[maxsize]; //用於存放每個點與哪個點連線

int pre[maxsize]; //並查集陣列,用於存放每個元素的父節點

int find(int x) //並查集搜尋

else

}void link(int x,int y) //判斷是否聯通,不連通就合併

}int main()

int count = 0; //count用來統計奇數點(與其他點有奇數個連線)

int num = 0; //num用來統計老祖宗個數,老祖宗有且僅有乙個說明是連通圖

for (int i = 1; i <= n; i++)

if (find(i) == i)

}if (count == 0 && num == 1) //當奇數點不存在且只有乙個老祖宗時,是尤拉迴路

else

return 0;

}

哥尼斯堡七橋問題

現在你需要找出走遍7座橋的方法,但是,必須遵守以下條件 1 走過的橋不能再走 2 可以多次經過同一塊陸地 3 可以以任一陸地為起點 4 不需要回到起點 數學家尤拉已經將這個問題作為一筆畫問題解決,這就是圖論的開山鼻祖。在反覆的實驗中,我們注意到了 要通過乙個頂點,這個頂點必須具有2條邊,即 入口邊 ...

哥尼斯堡七橋問題

18世紀著名古典數學問題之一。在哥尼斯堡的乙個公園裡,有七座橋將普雷格爾河中兩個島及島與河岸連線起來 如圖 問是否可能從這四塊陸地中任一塊出發,恰好通過每座橋一次,再回到起點?1736年,29歲的尤拉提交了 哥尼斯堡七橋 的 圓滿解決了這一問題,同時開創了數學新一分支 圖論。尤拉把每一塊陸地考慮成乙...

格尼斯堡七橋問題

拓補學問題集錦 現今的加里寧格勒,舊稱哥尼斯堡,是一座歷史名城。在十 八 十九世紀,那裡是東普魯士的首府,曾經誕生和培育過許多偉大的人物。著名的哲學家,古典唯心主義的創始人康德,終生沒有離開過哥尼斯堡一步 哥城景致迷人,碧波蕩漾的普累格河,橫貫其境。在河的中心有一座美麗的小島。普河的兩條支流,環繞其...