並查集之樹 Is It A Tree

2021-08-14 22:03:19 字數 858 閱讀 1534

注意:並查集必須初始祖先f[i]=i; !!!!

並查集判斷樹:

1. 空樹,沒有結點, 是樹

2. 判斷根節點個數,大於1不是樹

3. 多個父結點,或已有關係

4. 編號不連續,要記錄結點是否存在 vis[n]

#include#include#include#define n 100000

int f[n], flag, vis[n];

int getf(int x)

}void merge(int a, int b)

int main()

if (flag || cnt > 1)///如果沒有環 也不是森林

printf("case %d is not a tree.\n", ans++);

else

printf("case %d is a tree.\n", ans++);

memset(vis, 0, sizeof(vis));

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

f[i] = i;

flag = 0;

cnt = 0;

continue;

}vis[a] = vis[b] = 1;

if (f[a] == f[b] || f[b] != b)///合併之前已在同一棵樹上 或b結點已經有父親

flag = 1;

merge(a, b);//合併

}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 ...

偶數樹 並查集

給你一棵有n個節點的樹 乙個無環簡單圖 節點序號為1 n,根節點為1。請你找出乙個最大的整數k,表示從這棵樹上斷掉k條邊使其所有的子樹的節點數都為偶數。第一行輸入兩個整數n,m。表示這棵樹有n個節點和m條邊。接下來有m行,每行輸入兩個整數u,v,表示u節點和v節點間有一條邊相連。資料保證 2 n 1...

資料結構之樹(並查集)

0,2,4,6,8的標籤為0。1,3,5,7,9的標籤為1。標籤為0和1表示兩個不同的集合。查詢元素p所對應的集合編號,o 1 複雜度 private intfind int p 檢視元素p和元素q是否所屬乙個集合,o 1 複雜度 public boolean isconnected int p,i...