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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2021秋季《数据结构》_EOJ 1086.哥尼斯堡的七桥问题

發布時間:2023/12/18 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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.哥尼斯堡的七桥问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。