hdu3018連通分量的尤拉迴路))

2021-06-17 18:16:14 字數 1189 閱讀 6973

題目意思:

有乙個團隊的人要去逛小鎮,這個鎮是無向圖,然後規定每條路只能走一次,且兩個小鎮之間只有一條小路。(就避免了多條路徑的問題。)然後這個圖有可能有連通分量,如果圖有孤立點,那麼這個點就忽略掉,(這個挺有用)。問要分為幾組人馬才能夠把這個城市的小鎮全部逛完。

解題思路:(連通分量,粗俗地講就是乙個圖的幾個隔離的子圖,每個子圖為乙個連通分量)

這裡有個公式:如果每個連通分量的節點的度為偶數,那麼就可以一筆畫,如果連通分量中的節點的度為奇數點個數除以2;由於題目的資料量有滴滴微大,節點數100000,邊數200000;所以這裡要用鄰接表做,然後要算每乙個連通分量,就要用到並查集了。

解題報告:

尤拉迴路:圖g,若存在一條路,經過g中每條邊有且僅有一次,稱這條路為尤拉路,如果存在一條迴路經過g每條邊有且僅有一次,

稱這條迴路為尤拉迴路。具有尤拉迴路的圖成為尤拉圖。

判斷尤拉路是否存在的方法

有向圖:圖連通,有乙個頂點出度大入度1,有乙個頂點入度大出度1,其餘都是出度=入度。

無向圖:圖連通,只有兩個頂點是奇數度,其餘都是偶數度的。

判斷尤拉迴路是否存在的方法

有向圖:圖連通,所有的頂點出度=入度。

無向圖:圖連通,所有頂點都是偶數度。

本題呢。先用並查集檢視共有幾棵樹, 記錄下每棵樹中度為奇數的點的個數。 如果該樹中度為奇數的點的個數為0, 且代表元的度為0,證明該點為孤立的點,按題目要求的略過就可以了。如果代表元的度不為0, 且該樹中度為奇數的店為0,那麼證明為尤拉迴路,1組就能搞定;如果這兩種情況都不屬於,那麼瀏覽該樹中的點要用奇數點的個數/2

**如下:

#include

#include

int pre[100006];

int degree[100006];

int map[100006],ans[100006],p[100006];

int find(int k)

int main()

for(i=1;i<=n;i++)

r=0;

for(i=1;i<=m;i++)

if(degree[i]%2==1)

ans[root]++;

//儲存這個集合的奇數度數的個數  }

sum=0;

for(i=0;i

printf("%d\n",sum); }

return 0; }

hdu 3018(尤拉路 並查集)

傳送門 題解 對於一般的無向連通圖,如果有x個點入度為奇數,覆蓋所有邊所需要的筆數是max x 2,1 嚴格證明戳這兒。可以理解為用x 2筆消掉多出來的邊,取1的時候圖是乙個尤拉圖。p.s.注意特判 include include include include using namespace st...

hdu 3018 尤拉迴路 並查集

題意 給出乙個圖,問幾筆畫才能經過所有邊 思路 對於乙個連通圖而言,有這樣的乙個性質 其需要畫的筆數 度數為奇數的點數除以2,那麼由於給出的圖並沒有說明是否是連通圖,我們需要用並查集來維護連通圖,並且忽略單點的 子圖 include define fi first define se second ...

雙連通分量和強連通分量的總結

一 邊雙連通分量定義 在分量內的任意兩個點總可以找到兩條邊不相同的路徑互相到達。總而言之就是乙個圈,正著走反著走都可以相互到達,至少只有乙個點。二 點雙連通分量的定義 參照上面,唯一的不同 任意兩個點可以找到乙個點不同的路徑互相到達。也是乙個圈,正反走都可以,至少為乙個點。三 邊 點雙連通分量模板 ...