Mercurial > lbo > hg > ccplay
view arrays.cc @ 23:c3fb5f666e2d
graphs: Two graph algorithms
author | Lewin Bormann <lbo@spheniscida.de> |
---|---|
date | Sun, 09 Apr 2023 17:17:04 +0200 |
parents | ecc574aa2021 |
children |
line wrap: on
line source
#include <iostream> #include <vector> #include <unordered_set> #include <tuple> #include "lib/exec.h" using namespace std; template<typename T> vector<pair<T,T>> twosum(const vector<T>& v, T sum) { unordered_set<T> rem; vector<pair<T,T>> pairs; for (const T& e : v) { if (rem.count(sum-e) > 0) { pairs.push_back(make_pair(e, sum-e)); } else { rem.insert(e); } } return pairs; } template<typename T> void threesum(const vector<T>& v, T sum) { vector<tuple<T,T,T>> triples; for (const T& e : v) { T rem = sum - e; auto pairs = twosum(v, rem); for (const pair<T,T>& p : pairs) { triples.push_back(make_tuple(p.first, p.second, e)); } } /* for (const auto& t : triples) { cout << get<0>(t) << " " << get<1>(t) << " " << get<2>(t) << endl; } */ } int twosum_entry(void) { vector<int> v{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,-1,-2,-3,-4,-5,-6,-7,-8,-9}; benchmarkit([&v]() { twosum(v, 20); }); return 0; } int threesum_entry(void) { vector<int> v{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,-1,-2,-3,-4,-5,-6,-7,-8,-9}; benchmarkit([&v]() { threesum(v, 20); }); return 0; } int main(int argc, char** argv) { if (argc < 2) { cerr << "need task supplied on command line!\n"; return 1; } string task(argv[1]); if (task == "twosum") twosum_entry(); else if (task == "threesum") threesum_entry(); return 0; }