aboutsummaryrefslogtreecommitdiffstats
path: root/meowpp.test/src/DisjointSet.cpp
diff options
context:
space:
mode:
authorcathook <b01902109@csie.ntu.edu.tw>2014-05-02 04:10:56 +0800
committercathook <b01902109@csie.ntu.edu.tw>2014-05-02 04:10:56 +0800
commit33d419e4d54d969798af80f05e05f0c447a99594 (patch)
treec78355a2d334e34df865aca865dbb4864a85820c /meowpp.test/src/DisjointSet.cpp
parentd2d7a49563a8f04bd07264a4a989d5656313d375 (diff)
downloadmeow-33d419e4d54d969798af80f05e05f0c447a99594.tar.gz
meow-33d419e4d54d969798af80f05e05f0c447a99594.tar.zst
meow-33d419e4d54d969798af80f05e05f0c447a99594.zip
big change about dir structure
Diffstat (limited to 'meowpp.test/src/DisjointSet.cpp')
-rw-r--r--meowpp.test/src/DisjointSet.cpp82
1 files changed, 82 insertions, 0 deletions
diff --git a/meowpp.test/src/DisjointSet.cpp b/meowpp.test/src/DisjointSet.cpp
new file mode 100644
index 0000000..ca9db24
--- /dev/null
+++ b/meowpp.test/src/DisjointSet.cpp
@@ -0,0 +1,82 @@
+#include "meowpp/dsa/DisjointSet.h"
+
+#include "meowpp.h"
+
+#include <vector>
+
+
+TEST(DisjointSet, "..."){
+ int N = 10000000;
+ meow::DisjointSet dsj(N);
+
+ meow::messagePrintf(1, "merge(0, 1) merge(0, 2) merge(0, 3) ... (N = %d)", N);
+ for(int i = 1; i < N; i++){
+ dsj.merge(0, i);
+ }
+ int root = dsj.root(0);
+ for(int i = 1; i < N; i++){
+ if(root != (int)dsj.root(i)){
+ meow::messagePrintf(-1, "fail");
+ return false;
+ }
+ }
+ meow::messagePrintf(-1, "ok");
+ //
+
+ dsj.reset(N);
+ meow::messagePrintf(1, "merge(0, 1) merge(1, 2) merge(2, 3) ... (N = %d)", N);
+ for(int i = 1; i < N; i++){
+ dsj.merge(i - 1, i);
+ }
+ root = dsj.root(0);
+ for(int i = 1; i < N; i++){
+ if(root != (int)dsj.root(i)){
+ meow::messagePrintf(-1, "fail");
+ return false;
+ }
+ }
+ meow::messagePrintf(-1, "ok");
+ //
+
+ int M = 1000;
+ N = 1000000;
+ dsj.reset(N);
+ std::vector<int> used(N, -1);
+ std::vector<int> nums[M];
+
+ meow::messagePrintf(1, "random test (N = %d)", N);
+ for(int i = 0; i < N / 10; i++){
+ int grp = rand() % M;
+ int who;
+ while(used[who = rand() % N] != -1);
+ nums[grp].push_back(who);
+ used[who] = grp;
+ }
+ meow::messagePrintf(0, "data created");
+ for(int i = 0; i < M; i++){
+ for(int k = 0; k < 100; k++){
+ int j1 = rand() % nums[i].size();
+ int j2 = rand() % nums[i].size();
+ dsj.merge(nums[i][j1], nums[i][j2]);
+ }
+ for(size_t j = 1; j < nums[i].size(); j++){
+ dsj.merge(nums[i][0], nums[i][j]);
+ }
+ }
+ for(int i = 0; i < N; i++){
+ bool ok = false;
+ if((int)used[i] == -1 && (int)dsj.root(i) == i){
+ ok = true;
+ }else{
+ if(dsj.root(i) == dsj.root(nums[used[i]][0])){
+ ok = true;
+ }
+ }
+ if(!ok){
+ meow::messagePrintf(-1, "fail");
+ return false;
+ }
+ }
+ meow::messagePrintf(-1, "ok");
+ return true;
+};