日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

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

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

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

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

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

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

輸入格式:

輸入第一行給出兩個(gè)正整數(shù),分別是節(jié)點(diǎn)數(shù)N?(1≤N≤1000)和邊數(shù)M;隨后的M行對(duì)應(yīng)M條邊,每行給出一對(duì)正整數(shù),分別是該條邊直接連通的兩個(gè)節(jié)點(diǎn)的編號(hào)(節(jié)點(diǎn)從1到N編號(hào))。

輸出格式:

若歐拉回路存在則輸出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

?

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

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

判斷一個(gè)圖為連通圖可以用DFS的方法判斷,也可以用并查集來(lái)判斷。這里給一個(gè)代碼

#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; }

?

總結(jié)

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

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