From 7d2d9fd82c4ac5c9185dec158c8ea67fe08b37e4 Mon Sep 17 00:00:00 2001 From: stefiosif Date: Tue, 20 Sep 2022 13:41:15 +0300 Subject: [PATCH] Finish italiano and tests --- algorithm/italiano.h | 72 +++++++++++++++++++++------------------- test/decremental_test.cc | 61 ++++++++++++++++++++-------------- 2 files changed, 73 insertions(+), 60 deletions(-) diff --git a/algorithm/italiano.h b/algorithm/italiano.h index ddc8e8d..15d0c1f 100644 --- a/algorithm/italiano.h +++ b/algorithm/italiano.h @@ -6,6 +6,7 @@ #include "graph/breadth_first_tree.h" #include +#include using namespace graph; @@ -32,25 +33,24 @@ private: // Incoming / Outgoing edges struct Edges { - std::forward_list inc; - std::forward_list out; + std::set inc; + std::set out; }; std::map E; }; template void Italiano::init() { - for (const auto& u : std::views::keys(G.adjMatrix)) { + for (const auto& u : G.vertices()) { for (const auto& v : G.adjMatrix[u]) { - E[v].inc.push_front(u); - E[u].out.push_front(v); + E[v].inc.insert(u); + E[u].out.insert(v); TC[u][v] = false; } - RT[u] = BreadthFirstTree(G, u); + RT[u] = BreadthFirstTree(G, u); TC[u][u] = true; - for (const auto& v : std::views::keys(RT[u].adjMatrix)) { + for (const auto& v : RT[u].vertices()) TC[u][v] = true; - } } } @@ -61,41 +61,43 @@ bool Italiano::query(const T& u, const T& v) { template void Italiano::remove(const T& u, const T& v) { - std::map> R; - for (const auto& w : std::views::keys(G.adjMatrix)) { - if (RT[w].contains(u, v) && - std::distance(E[w].inc.begin(), E[w].inc.end()) > 1) { - if (E[v].inc.front() == u) { - E[v].inc.pop_front(); - R[w].push_front(E[v].inc.front()); - E[v].inc.push_front(u); - } else { - R[w].push_front(E[v].inc.front()); + std::map> H; + + for (const auto& w : G.vertices()) { + if (RT[w].contains(u, v)) { + if (E[v].inc.size() > 1) + H[w].push(v); + else { + TC[w][v] = false; + for (const auto& c : E[v].out) + H[w].push(c); } } } - E[u].inc.remove(v); - E[u].out.remove(u); + + E[u].out.erase(v); + E[v].inc.erase(u); G.remove(u, v); - for (const auto& w : std::views::keys(G.adjMatrix)) { - bool hooked = false; - // R contains all vertices that need a hook-parent - while (!R[w].empty()) { - // z is a candidate hook-parent if it is in RT[w] - const auto& toHook = R[w].front(); - for (const auto& z : E[toHook].inc) { - if (RT[w].contains(u, z)) { - R[w].remove(toHook); - hooked = true; + for (const auto& z : G.vertices()) { + RT[z].adjMatrix[u].erase(v); + while (H[z].size() > 0) { + auto& h = H[z].top(); + bool found = false; + for (const auto& i : E[h].inc) { + if (RT[z].contains(z, i)) { + RT[z].adjMatrix[i].insert(h); + H[z].pop(); + found = true; break; } } - if (!hooked) { - TC[w][toHook] = false; - for (const auto& z : E[toHook].out) { - if (RT[w].contains(toHook, z)) - R[w].push_front(z); + if (!found) { + TC[u][v] = false; + for (const auto& o : E[h].out) { + if (RT[z].contains(z, o)) { + H[z].push(o); + } } } } diff --git a/test/decremental_test.cc b/test/decremental_test.cc index 7a7885b..96a20fd 100644 --- a/test/decremental_test.cc +++ b/test/decremental_test.cc @@ -102,8 +102,8 @@ TEST_SUITE("Decremental algorithms") { SUBCASE("Italiano::remove") { italiano.remove(4, 6); - CHECK_EQ(italiano.query(1, 8), true); CHECK_EQ(italiano.query(3, 6), true); + CHECK_EQ(italiano.query(4, 6), true); italiano.remove(5, 6); @@ -113,43 +113,54 @@ TEST_SUITE("Decremental algorithms") { } TEST_CASE("Frigioni 1") { - // 1 --> 2 --> 3 --> 1 - // 3 --> 4 --> 5 --> 3 - // 2 --> 6 --> 7 --> 8 --> 6 - // 7 --> 9 - // 6 --> 9 --> 10 --> 11 --> 12 --> 13 --> 9 - // 12 --> 10 + // 1 --> 2 --> 4 --> 6 --> 8 --> 9 --> 5 + // 4 --> 5 --> 7 --> 8 + // 5 --> 6 + // 7 --> 9 + // 2 --> 3 --> 1 + // 3 --> 5 + // 3 --> 9 Digraph G; G.insert(1, 2); + G.insert(2, 4); G.insert(2, 3); G.insert(3, 1); - G.insert(3, 4); + G.insert(3, 5); + G.insert(3, 9); G.insert(4, 5); - G.insert(5, 3); - G.insert(2, 6); - G.insert(6, 7); + G.insert(4, 6); + G.insert(5, 6); + G.insert(5, 7); + G.insert(6, 8); G.insert(7, 8); G.insert(7, 9); - G.insert(8, 6); - G.insert(6, 9); - G.insert(9, 10); - G.insert(10, 11); - G.insert(11, 12); - G.insert(12, 13); - G.insert(13, 9); - G.insert(12, 10); + G.insert(8, 9); + G.insert(9, 5); - REQUIRE_EQ(G.adjMatrix.size(), 13); + REQUIRE_EQ(G.adjMatrix.size(), 9); algo::Frigioni frigioni(G); frigioni.init(); - + /* SUBCASE("Frigioni::query") { - - } - + CHECK_EQ(frigioni.query(1, 9), true); + CHECK_EQ(frigioni.query(2, 8), true); + CHECK_EQ(frigioni.query(3, 9), true); + CHECK_EQ(frigioni.query(4, 3), false); + CHECK_EQ(frigioni.query(5, 4), false); + CHECK_EQ(frigioni.query(6, 1), false); + }*/ + /* SUBCASE("Frigioni::remove") { + frigioni.remove(4, 6); - } + CHECK_EQ(frigioni.query(1, 8), true); + CHECK_EQ(frigioni.query(3, 6), true); + + frigioni.remove(4, 6); + + CHECK_EQ(frigioni.query(1, 9), true); + CHECK_EQ(frigioni.query(1, 6), false); + }*/ } } \ No newline at end of file