PTA:7-1 哥尼斯堡的“七桥问题” (25 分)
生活随笔
收集整理的這篇文章主要介紹了
PTA:7-1 哥尼斯堡的“七桥问题” (25 分)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、題目
哥尼斯堡是位于普累格河上的一座城市,它包含兩個島嶼及連接它們的七座橋,如下圖所示。可否走過這樣的七座橋,而且每橋只走過一次?瑞士數學家歐拉(Leonhard Euler,1707—1783)最終解決了這個問題,并由此創立了拓撲學。這個問題如今可以描述為判斷歐拉回路是否存在的問題。歐拉回路是指不令筆離開紙面,可畫過圖中每條邊僅一次,且可以回到起點的一條回路。現給定一個無向圖,問是否存在歐拉回路?輸入格式: 輸入第一行給出兩個正整數,分別是節點數N (1≤N≤1000)和邊數M;隨后的M行對應M條邊,每行給出一對正整數,分別是該條邊直接連通的兩個節點的編號(節點從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二、相關知識
1.考察歐拉回路問題 歐拉回路:圖G,若存在一條路,經過G中每條邊有且僅有一次,稱這條路為歐拉路, 如果存在一條回路經過G每條邊有且僅有一次有向圖:圖連通,有一個頂點出度大入度1,有一個頂點入度大出度1,其余都是出度=入度。 無向圖:圖連通,只有兩個頂點是奇數度,其余都是偶數度的。判斷歐拉回路是否存在的方法 有向圖:圖連通,所有的頂點出度=入度。 無向圖:圖連通,所有頂點都是偶數度。2.并查集 使用并查集解決此問題。 通過并查集可以得知該節點是否度數為0,即是否是單獨的一個點或者連通塊 [并查集知識](https://zhuanlan.zhihu.com/p/93647900/)三、代碼
(同一學校請勿直接扮演。。。😰害怕)
//七橋問題 //歐拉回路、并查集 #include<iostream> using namespace std; int dushu[1010];//節點度數記錄 int fa[1010];//并查集 int find(int x) {//將父節點設置為根節點 return x==fa[x]?x:(fa[x]=find(fa[x]));} void merge(int x,int y)//合并,將序號小的設置為序號大的根節點 {int fx=find(x);int fy=find(y);//尋找兩個根節點 if(fx>fy)fa[fx]=fy;elsefa[fy]=fx;} int main(){for(int i=0;i<1010;i++)fa[i]=i;//初始化操作,一般將父節點設置為本身 int n,m;cin>>n>>m;for(int i=0;i<m;i++){int x1,x2;cin>>x1>>x2;merge(x1,x2);//合并,設置父節點 dushu[x1]++;dushu[x2]++; }int flag=1;//設置判斷標志int sum=0;//連通塊個數for(int i=1;i<=n;i++){//無向連通圖,且所有節點度數為偶數,則存在歐拉回路 if(dushu[i]%2!=0)flag=0;//度數為奇數,不連通if(i==fa[i])sum++;//判斷度數為0的點(父節點是其本身,證明度數為0) }if(sum!=1)flag=0;if(flag==1) cout<<"1";if(flag==0) cout<<"0"; return 0; }程序是藍色的詩
總結
以上是生活随笔為你收集整理的PTA:7-1 哥尼斯堡的“七桥问题” (25 分)的全部內容,希望文章能夠幫你解決所遇到的問題。