diff --git a/Article.txt b/Article.txt new file mode 100644 index 0000000..74a8f64 --- /dev/null +++ b/Article.txt @@ -0,0 +1,53 @@ +M1: + 1 1 1 0 0 0 0 0 -1 0 +-1 0 0 1 1 1 0 0 0 0 + 0 -1 0 -1 0 0 1 0 0 -1 + 0 0 -1 0 -1 0 -1 1 0 0 + 0 0 0 0 0 0 0 0 1 1 + 0 0 0 0 0 -1 0 -1 0 0 + +0 1 1 1 0 0 +0 0 1 1 0 1 +0 0 0 1 0 0 +0 0 0 0 0 1 +1 0 1 0 0 0 +0 0 0 0 0 0 + +TC: +1 1 1 1 0 1 +0 1 1 1 0 1 +0 0 1 1 0 1 +0 0 0 1 0 1 +1 1 1 1 1 1 +0 0 0 0 0 1 + +M2: +-1 1 1 1 1 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 + 0 -1 0 0 0 -1 1 1 1 0 0 0 0 0 0 -1 0 0 0 0 0 + 0 0 -1 0 0 0 -1 0 0 -1 1 1 0 0 0 0 -1 0 0 0 0 + 0 0 0 -1 0 0 0 -1 0 0 -1 0 -1 1 0 0 0 -1 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 -1 1 0 + 0 0 0 0 -1 0 0 0 -1 0 0 -1 0 -1 0 0 0 0 0 -1 -1 + +0 1 1 1 0 1 +0 0 1 1 0 1 +0 0 0 1 0 1 +0 0 0 0 0 1 +1 1 1 1 0 1 +0 0 0 0 0 0 + +M3: +-1 0 0 1 1 -1 0 1 1 -1 1 1 0 0 -1 -1 -1 0 0 0 0 + 1 -1 -1 -2 -2 0 0 -1 -1 0 -1 -1 -1 0 2 1 1 0 -1 0 -1 + 0 1 0 1 0 1 -1 0 -1 0 1 0 1 -1 0 1 0 1 0 0 0 + 0 0 1 0 0 0 1 0 0 1 -1 -1 0 0 -1 -1 0 -1 1 -1 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 1 0 0 0 1 0 0 1 0 1 0 0 0 0 0 1 1 + +0 1 0 0 0 0 +1 0 0 0 0 0 +1 1 0 1 0 0 +1 1 1 0 0 0 +0 0 0 0 0 0 +0 1 1 1 0 0 + diff --git a/Permutation.txt b/Permutation.txt new file mode 100644 index 0000000..e12d446 --- /dev/null +++ b/Permutation.txt @@ -0,0 +1,32 @@ +G1: +0 1 1 1 0 0 +0 0 1 1 0 1 +0 0 0 1 0 0 +0 0 0 0 0 1 +1 0 1 0 0 0 +0 0 0 0 0 0 + +TC: +1 1 1 1 0 1 +0 1 1 1 0 1 +0 0 1 1 0 1 +0 0 0 1 0 1 +1 1 1 1 1 1 +0 0 0 0 0 1 + +G2: +0 1 0 0 0 0 +0 0 1 0 0 1 +0 0 0 1 0 0 +0 0 0 0 0 1 +1 0 0 0 0 0 +0 0 0 0 0 0 + +TC: +1 1 1 1 0 1 +0 1 1 1 0 1 +0 0 1 1 0 1 +0 0 0 1 0 1 +1 1 1 1 1 1 +0 0 0 0 0 1 + diff --git a/Source/Graph.cpp b/Source/Graph.cpp index 9a666c0..b44bc4c 100644 --- a/Source/Graph.cpp +++ b/Source/Graph.cpp @@ -116,6 +116,78 @@ Graph *Graph::ToTransitiveClosure() return new Graph(closure, closure.size()); } +void Graph::TransitiveReduction() +{ + auto closure = this->GetAdjacencyMatrix(); + + cout << "G1:" << endl; + Graph::_PrintAdjacencyMatrix(closure); + + for (auto k = 0; k < this->nodes; k++) + { + for (auto i = 0; i < this->nodes; i++) + { + for (auto j = 0; j < this->nodes; j++) + { + if (i == j) + { + closure[i][j] = 1; + } + else + { + closure[i][j] = closure[i][j] || (closure[i][k] && closure[k][j]); + } + } + } + } + + cout << "TC:" << endl; + Graph::_PrintAdjacencyMatrix(closure); + + auto reduction = this->GetAdjacencyMatrix(); + + for (auto j = 0; j < this->nodes; j++) + { + for (auto i = 0; i < this->nodes; i++) + { + if (reduction[i][j] == 1) + { + for (auto k = 0; k < this->nodes; k++) + { + if (reduction[j][k] == 1) + { + reduction[i][k] = 0; + } + } + } + } + } + + cout << "G2:" << endl; + Graph::_PrintAdjacencyMatrix(reduction); + + for (auto k = 0; k < this->nodes; k++) + { + for (auto i = 0; i < this->nodes; i++) + { + for (auto j = 0; j < this->nodes; j++) + { + if (i == j) + { + reduction[i][j] = 1; + } + else + { + reduction[i][j] = reduction[i][j] || (reduction[i][k] && reduction[k][j]); + } + } + } + } + + cout << "TC:" << endl; + Graph::_PrintAdjacencyMatrix(reduction); +} + /* void Graph::TransitiveClosure() { diff --git a/Source/Graph.h b/Source/Graph.h index e34284e..c9abda3 100644 --- a/Source/Graph.h +++ b/Source/Graph.h @@ -87,6 +87,8 @@ public: Graph *ToTransitiveClosure(); + void TransitiveReduction(); + public: static vector> MultiplyIncidenceMatrix(const vector> &matrix1, const vector> &matrix2) { diff --git a/Source/Main.cpp b/Source/Main.cpp index 082de78..07a4f75 100644 --- a/Source/Main.cpp +++ b/Source/Main.cpp @@ -5,7 +5,6 @@ int main() int nodes = 6; Graph *g1 = new Graph(nodes); - g1->AddEdge(0, 0); g1->AddEdge(0, 1); g1->AddEdge(0, 2); g1->AddEdge(0, 3); @@ -17,22 +16,24 @@ int main() g1->AddEdge(4, 0); g1->AddEdge(4, 2); - cout << "M1:" << endl; - g1->PrintIncidenceMatrix(); - g1->PrintAdjacencyMatrix(); - auto m1 = g1->GetIncidenceMatrix(); + g1->TransitiveReduction(); - Graph *g2 = g1->ToTransitiveClosure(); - cout << "M2:" << endl; - g2->PrintIncidenceMatrix(); - g2->PrintAdjacencyMatrix(); - auto m2 = g2->GetIncidenceMatrix(); + // cout << "M1:" << endl; + // g1->PrintIncidenceMatrix(); + // g1->PrintAdjacencyMatrix(); + // auto m1 = g1->GetIncidenceMatrix(); - auto m3 = Graph::MultiplyIncidenceMatrix(m1, m2); - Graph *g3 = new Graph(m3); - cout << "M3:" << endl; - g3->PrintIncidenceMatrix(); - g3->PrintAdjacencyMatrix(); + // Graph *g2 = g1->ToTransitiveClosure(); + // cout << "M2:" << endl; + // g2->PrintIncidenceMatrix(); + // g2->PrintAdjacencyMatrix(); + // auto m2 = g2->GetIncidenceMatrix(); + + // auto m3 = Graph::MultiplyIncidenceMatrix(m1, m2); + // Graph *g3 = new Graph(m3); + // cout << "M3:" << endl; + // g3->PrintIncidenceMatrix(); + // g3->PrintAdjacencyMatrix(); return 0; }