hdu1878尤拉迴路 並查集學習 尤拉路學習

2021-07-23 13:01:59 字數 2549 閱讀 4632

首先以hdu1878 為列子寫下

這道題是純的尤拉迴路 直接寫就是了

首先介紹下尤拉路的一些定義與性質

以下來自於這裡

在做一些圖類時經常要用到尤拉路,比如近期的單詞連線和塗彩棒等,下面整理了一點:

尤拉通路: 通過圖中每條邊且只通過一次,並且經過每一頂點的通路。

尤拉迴路: 通過圖中每條邊且只通過一次,並且經過每一頂點的迴路。

無向圖是否具有尤拉通路或迴路的判定:

尤拉通路:圖連通;圖中只有0個或2個度為奇數的節點

尤拉迴路:圖連通;圖中所有節點度均為偶數

有向圖是否具有尤拉通路或迴路的判定:

尤拉通路:圖連通;除2個端點外其餘節點入度=出度;1個端點入度比出度大1;乙個端點入度比出度小1 或 所有節點入度等於出度

尤拉迴路:圖連通;所有節點入度等於出度

混合圖尤拉迴路:

原來混合圖尤拉迴路用的是網路流。

把該圖的無向邊隨便定向,計算每個點的入度和出度。如果有某個點出入度之差為奇數,那麼肯定不存在尤拉迴路。因為尤拉迴路要求每點入度 

=出度,也就是總度數為偶數,存在奇數度點必不能有尤拉迴路。

好了,現在每個點入度和出度之差均為偶數。那麼將這個偶數除以2,得x。也就是說,對於每乙個點,只要將x條邊改變方向(入

>

出就是變入,出

>

入就是變出),就能保證出 

=入。如果每個點都是出 

=入,那麼很明顯,該圖就存在尤拉迴路。

現在的問題就變成了:我該改變哪些邊,可以讓每個點出 

=入?構造網路流模型。首先,有向邊是不能改變方向的,要之無用,刪。一開始不是把無向邊定向了嗎?定的是什麼向,就把網路構建成什麼樣,邊長容量上限1。另新建s和t。對於入 

>

出的點u,連線邊(u, t)、容量為x,對於出 

>

入的點v,連線邊(s, v),容量為x(注意對不同的點x不同)。之後,察看是否有滿流的分配。有就是能有尤拉迴路,沒有就是沒有。尤拉迴路是哪個?察看流值分配,將所有流量非0(上限是1,流值不是0就是1)的邊反向,就能得到每點入度 

=出度的尤拉圖。

由於是滿流,所以每個入 

>

出的點,都有x條邊進來,將這些進來的邊反向,ok,入 

=出了。對於出 

>

入的點亦然。那麼,沒和s、t連線的點怎麼辦?和s連線的條件是出 

>

入,和t連線的條件是入 

>

出,那麼這個既沒和s也沒和t連線的點,自然早在開始就已經滿足入 

=出了。那麼在網路流過程中,這些點屬於「中間點」。我們知道中間點流量不允許有累積的,這樣,進去多少就出來多少,反向之後,自然仍保持平衡。

所以,就這樣,混合圖尤拉迴路問題解決了。

所以直接判斷是否連通和每個點的入度是否為偶數  判斷是否聯通一般的方法是dfs或者並查集

並查集在動態連通圖上解決的問題是

首先給出並查集初始化函式

for(int i = 0; i < size; i++)  

pa[i] = i;

表示初始化每個節點的父節點是自己

那麼接下來就是建立查詢函式

int find(int x)
使用遞迴比較好理解  然後是節點的結合

void unite(int x, int y)
那麼什麼是啟發式結合 下面是網路上的圖 所謂啟發式的作用就是排除在建立並查集的時候所導致的一邊重一邊輕的情況 比如以下 這樣可以更快的查詢

初始化

for (int i = 0; i < n; i++)  

sz[i] = 1; // 初始情況下,每個組的大小都是1 每個集合的大小

**

void union(int p, int q)  

else

}

int findset(int x)//路徑壓縮 同時維護權d[i];i到樹根的距離 d[i]為每個節點的權

else

return x;

}

hdu1878  並查集

#include#include#includeusing namespace std;

int degree[1005],pa[1005];

int m,n;

void init()

}int find(int x)

void unite(int x, int y)

int main()

}void dfs(int x)

{ vis[x]=1;

for(int i=0;i

A 尤拉迴路 並查集 HDU 1878

題目連線 尤拉迴路是指不令筆離開紙面,可畫過圖中每條邊僅一次,且可以回到起點的一條迴路。現給定乙個圖,問是否存在尤拉迴路?input 測試輸入包含若干測試用例。每個測試用例的第1行給出兩個正整數,分別是節點數n 1 n 1000 和邊數m 隨後的m行對應m條邊,每行給出一對正整數,分別是該條邊直接連...

hdu1878 並查集,尤拉迴路

純裸題。寫著方便理解。題意 判斷乙個無向圖是否存在尤拉迴路。解題思路 並查集判斷一下是否聯通,然後再判斷一下點的度數是否為偶數就行了 include include include include define maxn 2010 using namespace std intf maxn int ...

HDU 1878 尤拉迴路(並查集 尤拉迴路判定)

解題思路 尤拉迴路的定義 從圖中某一頂點出發,所有邊僅經過一次,最後回到該頂點。判斷尤拉迴路 前提 這個圖是連通的,也就是所有點都連在乙個圖上了 無向圖 頂點度數為偶數 有向圖 所有點入度 出度 判斷是否連通用並查集即可,另外就是度數的統計。對於並查集陌生可以參考 includeusing name...