Make RodittyZwick class abstract

This commit is contained in:
stefiosif
2022-06-13 12:57:09 +03:00
parent cc79737ecc
commit 1e16e671ea
3 changed files with 72 additions and 35 deletions

View File

@@ -0,0 +1,61 @@
#ifndef DECREMENTAL_MAINTENANCE_H_
#define DECREMENTAL_MAINTENANCE_H_
#include "graph/digraph.h"
#include "graph/scc.h"
#include "algorithm/tarjan.h"
#include "algorithm/bfs.h"
#include "algorithm/roditty_zwick.h"
using namespace graph;
namespace algo {
template<typename T>
class DecrementalMaintenance : public RodittyZwick<T> {
public:
DecrementalMaintenance(Digraph<T> G) : G(G) {}
//
void init();
//
void query();
//
void remove();
private:
Digraph<T> G;
};
template<typename T>
void DecrementalMaintenance<T>::init() {
std::map<T, T> A;
Tarjan<T> tarjan(G);
auto sccs = tarjan.run();
for (auto& scc : sccs) {
const auto& root = scc.representative();
BFS<T> bfs(scc);
auto spt = bfs.run(root);
for (const auto& vertex : scc.vertices) {
A[vertex] = root;
}
}
}
template<typename T>
inline void DecrementalMaintenance<T>::query()
{
}
template<typename T>
inline void DecrementalMaintenance<T>::remove()
{
}
}; // namespace algo
#endif

View File

@@ -1,55 +1,30 @@
#ifndef RODITTY_ZWICK_H_
#define RODITTY_ZWICK_H_
#include "graph/digraph.h"
#include "graph/scc.h"
#include "algorithm/tarjan.h"
#include "algorithm/bfs.h"
#include <vector>
using namespace graph;
namespace algo {
// A randomized decremental algorithm for maintaining SCCs
template<typename T>
class RodittyZwick {
public:
RodittyZwick(Digraph<T> G) : G(G) {}
~RodittyZwick();
//
void sccDecrementalMaintenance();
virtual void init() =0;
//
void tcDecrementalMaintenance();
private:
Digraph<T> G;
virtual void query() =0;
//
virtual void remove() =0;
};
template<typename T>
void RodittyZwick<T>::sccDecrementalMaintenance() {
std::map<T, T> A;
Tarjan<T> tarjan(G);
auto sccs = tarjan.run();
for (auto& scc : sccs) {
const auto& root = scc.representative();
BFS<T> bfs(scc);
auto spt = bfs.run(root);
for (const auto& vertex : scc.vertices) {
A[vertex] = root;
}
}
}
template<typename T>
void RodittyZwick<T>::tcDecrementalMaintenance() {
RodittyZwick<T>::~RodittyZwick() {
}
}; // namespace algo
#endif
#endif