88
99#include " ../other/enumerate-maximum-independent-set-path-sums.hpp"
1010
11- template <class T > std::vector<T> brute_force (const std::vector<T> &a) {
11+ template <class T , bool maximum = true >
12+ std::vector<T> brute_force (const std::vector<T> &a) {
1213 const std::size_t n = a.size ();
1314 const std::size_t m = (n + 1 ) / 2 ;
1415 std::vector<T> answer (m + 1 , T ());
@@ -28,9 +29,19 @@ template <class T> std::vector<T> brute_force(const std::vector<T> &a) {
2829 sum += a[i];
2930 }
3031 }
31- if (ok && ( !found[count] || answer[count] < sum) ) {
32+ if (ok && !found[count]) {
3233 answer[count] = sum;
3334 found[count] = true ;
35+ } else if (ok) {
36+ if constexpr (maximum) {
37+ if (answer[count] < sum) {
38+ answer[count] = sum;
39+ }
40+ } else {
41+ if (sum < answer[count]) {
42+ answer[count] = sum;
43+ }
44+ }
3445 }
3546 }
3647 for (std::size_t i = 0 ; i <= m; i += 1 ) {
@@ -44,8 +55,16 @@ void test_signed_exhaustive() {
4455 std::vector<long long > a (n);
4556 auto dfs = [&](auto self, const std::size_t i) -> void {
4657 if (i == n) {
58+ const std::vector<long long > expected = brute_force (a);
59+ const std::vector<long long > expected_min =
60+ brute_force<long long , false >(a);
4761 assert (enumerate_maximum_independent_set_path_sums (a) ==
48- brute_force (a));
62+ expected);
63+ assert ((enumerate_maximum_independent_set_path_sums<long long ,
64+ false >(a) ==
65+ expected_min));
66+ assert (enumerate_maximum_independent_set_path_sums<false >(a) ==
67+ expected_min);
4968 return ;
5069 }
5170 for (long long x = -3 ; x <= 3 ; x += 1 ) {
@@ -62,8 +81,14 @@ void test_small_signed_type_exhaustive() {
6281 std::vector<signed char > a (n);
6382 auto dfs = [&](auto self, const std::size_t i) -> void {
6483 if (i == n) {
84+ const std::vector<signed char > expected = brute_force (a);
85+ const std::vector<signed char > expected_min =
86+ brute_force<signed char , false >(a);
6587 assert (enumerate_maximum_independent_set_path_sums (a) ==
66- brute_force (a));
88+ expected);
89+ assert ((enumerate_maximum_independent_set_path_sums<signed char ,
90+ false >(a) ==
91+ expected_min));
6792 return ;
6893 }
6994 for (signed char x = -3 ; x <= 3 ;
@@ -81,8 +106,15 @@ void test_signed_bucket_sort() {
81106 std::vector<int > a (n);
82107 auto dfs = [&](auto self, const std::size_t i) -> void {
83108 if (i == n) {
109+ const std::vector<int > expected = brute_force (a);
110+ const std::vector<int > expected_min =
111+ brute_force<int , false >(a);
84112 assert (enumerate_maximum_independent_set_path_sums_bucket_sort (
85- a) == brute_force (a));
113+ a) == expected);
114+ assert ((enumerate_maximum_independent_set_path_sums_bucket_sort<
115+ int , false >(a) == expected_min));
116+ assert (enumerate_maximum_independent_set_path_sums_bucket_sort<
117+ false >(a) == expected_min);
86118 return ;
87119 }
88120 for (int x = 0 ; x <= 4 ; x += 1 ) {
@@ -97,26 +129,44 @@ void test_signed_bucket_sort() {
97129void test_bucket_large_values () {
98130 const std::vector<int > a = {100 , 1 , 100 , 1 , 100 , 1 , 100 };
99131 const std::vector<int > expected = brute_force (a);
132+ const std::vector<int > expected_min = brute_force<int , false >(a);
100133 assert (enumerate_maximum_independent_set_path_sums (a) == expected);
134+ assert ((enumerate_maximum_independent_set_path_sums<int , false >(a) ==
135+ expected_min));
101136 assert (enumerate_maximum_independent_set_path_sums_bucket_sort (a) ==
102137 expected);
138+ assert ((enumerate_maximum_independent_set_path_sums_bucket_sort<int , false >(
139+ a) == expected_min));
103140
104141 const std::vector<std::int32_t > b = {3 , 0 , 5 , 0 , 4 , 1 };
105142 const std::vector<std::int32_t > expected_b = brute_force (b);
143+ const std::vector<std::int32_t > expected_b_min =
144+ brute_force<std::int32_t , false >(b);
106145 assert (enumerate_maximum_independent_set_path_sums_bucket_sort (b) ==
107146 expected_b);
147+ assert ((enumerate_maximum_independent_set_path_sums_bucket_sort<
148+ std::int32_t , false >(b) == expected_b_min));
108149}
109150
110151void test_bucket_small_signed_types () {
111152 const std::vector<short > a = {2 , 0 , 3 , 1 , 4 };
112153 const std::vector<short > expected = brute_force (a);
154+ const std::vector<short > expected_min = brute_force<short , false >(a);
113155 assert (enumerate_maximum_independent_set_path_sums_bucket_sort (a) ==
114156 expected);
157+ assert (
158+ (enumerate_maximum_independent_set_path_sums_bucket_sort<short , false >(
159+ a) == expected_min));
115160
116161 const std::vector<signed char > b = {2 , 0 , 3 , 1 , 4 };
117162 const std::vector<signed char > expected_b = brute_force (b);
163+ const std::vector<signed char > expected_b_min =
164+ brute_force<signed char , false >(b);
118165 assert (enumerate_maximum_independent_set_path_sums_bucket_sort (b) ==
119166 expected_b);
167+ assert ((enumerate_maximum_independent_set_path_sums_bucket_sort<signed char ,
168+ false >(b) ==
169+ expected_b_min));
120170}
121171
122172struct TestNumber {
@@ -153,11 +203,15 @@ void test_custom_type() {
153203 TestNumber (1 ), TestNumber (4 ),
154204 TestNumber (5 )};
155205 assert (enumerate_maximum_independent_set_path_sums (a) == brute_force (a));
206+ assert ((enumerate_maximum_independent_set_path_sums<TestNumber, false >(a) ==
207+ brute_force<TestNumber, false >(a)));
156208}
157209
158210void test_floating_point () {
159211 const std::vector<double > a = {1.5 , 100.25 , 1.5 , -3.0 , 10.0 , 2.0 };
160212 assert (enumerate_maximum_independent_set_path_sums (a) == brute_force (a));
213+ assert ((enumerate_maximum_independent_set_path_sums<double , false >(a) ==
214+ brute_force<double , false >(a)));
161215}
162216
163217void test_type_traits () {
0 commit comments