偶數樹 並查集

2021-08-02 07:38:39 字數 1226 閱讀 1998

給你一棵有n個節點的樹(乙個無環簡單圖),節點序號為1~n,根節點為1。

請你找出乙個最大的整數k,表示從這棵樹上斷掉k條邊使其所有的子樹的節點數都為偶數。

第一行輸入兩個整數n,m。表示這棵樹有n個節點和m條邊。

接下來有m行,每行輸入兩個整數u,v,表示u節點和v節點間有一條邊相連。

資料保證:2 ≤ n ≤ 100,並且所有的節點都在一棵樹上。

輸入的樹總能被分解為包含偶數個節點的子樹

輸出最多可以移除掉邊的數量。

10 9

2 1

3 1

4 3

5 2

6 1

7 2

8 6

9 8

10 8

樣例中移除掉(1,3)(1,6)兩條邊滿足條件。

原始樹:

分解的樹:

n為奇數的情況應該是不存在的 所以根節點1的子節點數一定是偶數(前提 記錄初始值為1所以結果減一

思路也不是很難想 就是想要用並查集實現這點不容易 多想想應該可以寫出來吧 (轉化為有向圖 序號統一由大指小)

把每個節點視為根節點 統計其子節點個數 那麼要斷掉的就是乙個子節點個數(包括它自己)是否是偶數 如果是那麼它和它的這一堆子節點便可以作為乙個整體 然後便可以和它指向的點斷開啦 經過這麼操作 即可得到最多可以得出的數量啦(遍歷了所有可能去斷的節點) 又因為根節點 1 無指向節點而它的子節點個數(包括它自己)一定是偶數 所以結果要減 1

#include 

#include

using

namespace

std;

int par[110],rkan[110];

int n,m;

void set_init()

}int find(int x)

void set_unit(int x,int y)

}}int main()

int ans = 0;

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

}printf("%d\n",ans-1);

return

0;}

並查集 並查集

本文參考了 挑戰程式設計競賽 和jennica的github題解 陣列版 int parent max n int rank max n void init int n int find int x else void union int x,int y else 結構體版 struct node ...

並查集入門(普通並查集 帶刪除並查集 關係並查集)

什麼是並查集?通俗易懂的並查集詳解 普通並查集 基礎並查集 例題 題解 how many tables problem description lh boy無聊的時候很喜歡數螞蟻,而且,還給每乙隻小螞蟻編號,通過他長期的觀察和記錄,發現編號為i的螞蟻會和編號為j的螞蟻在一起。現在問題來了,他現在只有...

並查集之樹 Is It A Tree

注意 並查集必須初始祖先f i i 並查集判斷樹 1.空樹,沒有結點,是樹 2.判斷根節點個數,大於1不是樹 3.多個父結點,或已有關係 4.編號不連續,要記錄結點是否存在 vis n include include include define n 100000 int f n flag,vis ...