備戰NOIP——模板複習2
阿新 • • 發佈:2018-12-18
這裡只有模板,並不作講解,僅為路過的各位做一個參考以及用做自己複習的資料,轉載註明出處。
並查集模板
路徑壓縮
/*Copyright: Copyright (c) 2018 *Created on 2018-10-28 *Author: 十甫 *Version 1.0 *Title: 並查集-路徑壓縮 *Time: 4 mins */ #include<cstdio> #include<iostream> using namespace std; const int size = 10005; int f[size]; inline int getf(int k) { if(f[k] != k) f[k] = getf(f[k]); return f[k]; } inline void merge(int a, int b) { int fa = getf(a), fb = getf(b); if(fa == fb) return; else f[fa] = fb; } inline void init(int n) { for(int i = 1;i <= n;i++) { f[i] = i; } } int main() { int n, m; scanf("%d%d", &n, &m); init(n); while(m--) { int man, a, b; scanf("%d%d%d", &man, &a, &b); if(man) { merge(a, b); } else { int fa = getf(a), fb = getf(b); if(fa == fb) printf("YES\n"); else printf("NO\n"); } } return 0; }
路徑壓縮+偽·按秩合併
/*Copyright: Copyright (c) 2018 *Created on 2018-10-28 *Author: 十甫 *Version 2.0 *Title: 並查集-路徑壓縮+偽·按秩合併 *Time: 12 mins */ #include<cstdio> #include<iostream> #include<cstdlib> #include<ctime> using namespace std; const int size = 10005; int f[size]; inline int getf(int k) { if(f[k] != k) f[k] = getf(f[k]); return f[k]; } inline void merge(int a, int b) { int fa = getf(a), fb = getf(b); if(fa == fb) return; else { if(rand() % 2) f[fa] = fb; else f[fb] = fa; } } inline void init(int n) { srand(time(NULL)); for(int i = 1;i <= n;i++) { f[i] = i; } } int main() { int n, m; scanf("%d%d", &n, &m); init(n); while(m--) { int man, a, b; scanf("%d%d%d", &man, &a, &b); if(man) { merge(a, b); } else { int fa = getf(a), fb = getf(b); if(fa == fb) printf("YES\n"); else printf("NO\n"); } } return 0; }