日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ 解决经典哥尼斯堡七桥问题

發(fā)布時間:2023/12/18 c/c++ 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ 解决经典哥尼斯堡七桥问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

7-32?哥尼斯堡的“七橋問題”?(25?point(s))

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

可否走過這樣的七座橋,而且每橋只走過一次?瑞士數(shù)學家歐拉(Leonhard Euler,1707—1783)最終解決了這個問題,并由此創(chuàng)立了拓撲學。

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

輸入格式:

輸入第一行給出兩個正整數(shù),分別是節(jié)點數(shù)N?(1≤N≤1000)和邊數(shù)M;隨后的M行對應M條邊,每行給出一對正整數(shù),分別是該條邊直接連通的兩個節(jié)點的編號(節(jié)點從1到N編號)。

輸出格式:

若歐拉回路存在則輸出1,否則輸出0。

輸入樣例1:

6 10 1 2 2 3 3 1 4 5 5 6 6 4 1 4 1 6 3 4 3 6

輸出樣例1:

1

輸入樣例2:

5 8 1 2 1 3 2 3 2 4 2 5 5 3 5 4 3 4

輸出樣例2:

0

?

歐拉回路是遍歷圖中的所有邊。?

給定一個圖存在歐拉回路的充要條件是圖為一個連通圖,且每個點的度數(shù)(發(fā)出的邊為偶數(shù))

判斷一個圖為連通圖可以用DFS的方法判斷,也可以用并查集來判斷。這里給一個代碼

#include <iostream> class UnionFind { private:int* parent;int count;int* rank; // rank[i]表示以i為根集合的層數(shù) public:UnionFind(int count_) {parent = new int[count_];rank = new int[count_];this->count = count_;for (int i = 0; i < count_; i++) {parent[i] = i;rank[i] = 1;}}~UnionFind() {delete[] parent;delete[] rank;}int find(int p) {//assert(p >= 0 && p < count);while (p != parent[p]) {parent[p] = parent[parent[p]];p = parent[p];}return p;}bool isConnected(int p, int q) {return find(p) == find(q);}void unionElements(int p, int q) {int pRoot = find(p);int qRoot = find(q);if (pRoot == qRoot)return;if (rank[pRoot] < rank[qRoot])parent[pRoot] = qRoot;else if (rank[qRoot] < rank[pRoot])parent[qRoot] = pRoot;else {parent[pRoot] = qRoot;rank[qRoot]++;}count--;}int size() {return count;}};bool HasEulerCircuit(UnionFind & Union, int degree[], int V) {if (Union.size()-1!= 1)return false;for (int i = 0; i < V; i++) {if (degree[i] % 2)return false;}return true; }int main() {int V, E, V1, V2;int degree[1010] = { 0 };std::cin >> V >> E;UnionFind Union = UnionFind(V+1);for (int i = 0; i < E; i++) {std::cin >> V1 >> V2;Union.unionElements(V1, V2);degree[V1]++;degree[V2]++;}if (HasEulerCircuit(Union, degree, V))std::cout << 1 << std::endl;elsestd::cout << 0 << std::endl; }

?

總結

以上是生活随笔為你收集整理的C++ 解决经典哥尼斯堡七桥问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。