2021秋季《数据结构》_EOJ 1086.哥尼斯堡的七桥问题
生活随笔
收集整理的這篇文章主要介紹了
2021秋季《数据结构》_EOJ 1086.哥尼斯堡的七桥问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目
哥尼斯堡是位于普累格河上的一座城市,它包含兩個島嶼及連接它們的七座橋,如圖所示。
可否走過這樣的七座橋,而且每橋只走過一次?瑞士數學家歐拉(Leonhard Euler,1707-1783)最終解決了這個問題,并由此創立了拓撲學。
這個問題如今可以描述為判斷歐拉回路是否存在的問題。歐拉回路是指不令筆離開紙面,可畫過圖中每條邊僅一次,且可以回到起點的一條回路。現給定一個無向圖,問是否存在歐拉回路?
思路
由于要求遍歷每一條邊,所以對于每一個點,進入這個點的邊和離開這個點的邊的數目必定相等。
要求滿足兩個條件
- 每個點的度為偶數
- 聯通圖,即沒有孤立點
其中,第二個條件用并查集思想解決,最終集中超過一個點即為非聯通圖。
代碼
#include<bits/stdc++.h> using namespace std;int find(int pre[], int x) {int tmp = x;while (pre[tmp]!=tmp){tmp = pre[tmp];}int k = x;while (k!=tmp){int j = pre[tmp];pre[k] = tmp;k = j;}return tmp; }void join(int pre[], int x, int y) {int rootx = find(pre, x);int rooty = find(pre, y);if (rootx != rooty){pre[x] = y;} }int main() {int n, m; cin >> n >> m;int* pre = new int[n + 1];for (int i = 1; i <= n; i++)pre[i] = i;int* a = new int[n + 1];memset(a, 0, sizeof(int) * (n + 1));for (int i = 0; i < m; i++){int x, y; cin >> x >> y;if (find(pre, x) != find(pre, y))join(pre, x, y);a[x]++, a[y]++;}int flag = 1;int cnt = 0;// 判斷聯通for (int i = 1; i <= n; i++){if (pre[i] == i)cnt++;}if (cnt != 1)flag = 0;// 判斷偶數度if (flag){for (int i = 1; i <= n; i++){if (a[i] == 0 || a[i] % 2 == 1){flag = 0;break;}}}cout << flag << endl;return 0;}總結
以上是生活随笔為你收集整理的2021秋季《数据结构》_EOJ 1086.哥尼斯堡的七桥问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转】photoshop CS2安装激活
- 下一篇: Android 10文档阅读总结