注意:並查集必須初始祖先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...