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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

[图论]欧拉回路的个数

發(fā)布時間:2024/7/5 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [图论]欧拉回路的个数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

歐拉回路就是用一筆走過所有的路,現(xiàn)在讓你判斷到底有幾個歐拉回路,也就是說走一個圖需要用幾筆。

傳送門QAQ

首先根據(jù)給出的邊我們只需要分別處理每個連通分量需要多少筆即可.

? ? ? ? 如果該連通分量是一個孤立的點,顯然只需要0筆.

? ? ? ? 如果該連通分量是一個歐拉圖或半歐拉圖,只需要1筆.

? ? ? ? 現(xiàn)在關(guān)鍵是連通分量并非一個(半)歐拉圖時,需要幾筆?

? ? ? ? 一般性的結(jié)論是:

? ? ? ?非(半)歐拉圖需要的筆數(shù)==該圖中奇數(shù)度的點數(shù)目/2

? ? ? ?下面來證明該結(jié)論:

? ? ? ?首先一個無向圖的連通分量中的奇數(shù)度的點個數(shù)一定是偶數(shù)個(成對出現(xiàn)),因為無向圖的總度數(shù)=偶數(shù).

? ? ? ?我們在這種連通分量中每次畫一筆有兩種選擇:

? ? ? ?1.a->b->c->d…->g??? 一條起點與終點不同的路徑(路中除首尾度減1外,每個點度減2)

? ? ? ?2.a->b->c->d…->a??? 一條起點與終點相同的回路(路中每個點度數(shù)減2)

? ? ? ?也就是說想要把非(半)歐拉圖分量中的奇數(shù)度的點的度數(shù)都變成偶數(shù),我們至少需要畫奇數(shù)度點個數(shù)/2 筆.

? ? ? ?那么對于這種圖我們最多需要畫的筆數(shù) 是不是也是 : 奇數(shù)度點個數(shù)/2 筆呢?

? ? ? ?答案是肯定的,這里假設(shè)圖中有4個奇數(shù)度的點,1,2,3,4,5,6.如下圖所示:

?

? ? ? ?我們先走路:1-> b-> c-> d-> e-> f->a-> 2 這條路.然后6,5 和3,4 分別屬于兩個連通分量了.可以看出只需要3筆,即6/2=3即可.

? ? ? ?也就是說對于這種非(半)歐拉圖的連通分量,我們每筆必然消除正好2個點的奇度(使其度變偶數(shù)),當最后一筆的時候我們必然消除所有的點的度數(shù)(包括剩下的兩個奇點,因為最后一筆就必然是歐拉通路).但是有一點要注意,有可能過程中的某幾筆會使得該連通分量變成多個連通分量,當然結(jié)論不變.

?????? 經(jīng)過上面的分析,這題的結(jié)論出來了,對于每個以i為根的連通分量我們記錄屬于該連通分量的點數(shù)目num[i]和該連通分量中奇度點的個數(shù)odd[i].

?????? 如果num[i]==0或1,需0筆.(注意num[i]==0表示i點不是根,num[i]==1表示i點是一個孤立的點.)

?????? 如果num[i]>1且odd[i]==0 需1筆

?????? 如果num[i]>1且odd[i]>0 需odd[i]/2筆

1 #include<iostream> 2 #include<cstdio> 3 #include<string> 4 #include<cstring> 5 #include<map> 6 #include<set> 7 #include<vector> 8 #include<queue> 9 #include<algorithm> 10 #include<cmath> 11 using namespace std; 12 #define ll long long 13 const int N = 100000 + 10; 14 int n, m,xx,yy; 15 int fa[N], indu[N], odd[N],num[N]; 16 int find(int x) 17 { 18 if (fa[x] == -1) return x; 19 return fa[x] = find(fa[x]); 20 } 21 void hebing(int a, int b) 22 { 23 a = find(a); 24 b = find(b); 25 if(a!=b) 26 fa[a] = b; 27 } 28 int main() 29 { 30 while (scanf("%d %d", &n, &m) != EOF) 31 { 32 memset(fa, -1, sizeof(fa)); 33 memset(indu, 0, sizeof(indu)); 34 memset(odd, 0, sizeof(odd)); 35 memset(num, 0, sizeof(num)); 36 while (m--) 37 { 38 scanf("%d %d",&xx,&yy); 39 indu[xx]++; 40 indu[yy]++; 41 hebing(xx, yy); 42 } 43 for (int i = 1; i <= n; i++) 44 { 45 num[find(i)]++; 46 if (indu[i] % 2 == 1) 47 odd[find(i)]++; 48 } 49 int ans = 0; 50 for (int i = 1; i <= n; i++) 51 { 52 if (num[i] <= 1) continue; 53 if (odd[i] == 0) ans += 1; 54 else ans += odd[i] / 2; 55 } 56 printf("%d\n",ans); 57 } 58 59 return 0; 60 } View Code

?

轉(zhuǎn)載于:https://www.cnblogs.com/Kaike/p/10417939.html

總結(jié)

以上是生活随笔為你收集整理的[图论]欧拉回路的个数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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