Rename "complete subgraph" to "clique" and use std::set instead of sorted std::vector in LanParty

This commit is contained in:
Stefan Müller 2025-06-27 21:11:15 +02:00
parent f687f416ac
commit 03788ddf55
2 changed files with 13 additions and 13 deletions

View File

@ -34,10 +34,10 @@ class LanParty
Graph<std::string, void> lan_{}; Graph<std::string, void> lan_{};
std::map<std::string, int> labelMap_{}; std::map<std::string, int> labelMap_{};
int findOrAddVertex(const std::string& vertexId); int findOrAddVertex(const std::string& vertexId);
void computeInterconnectedThreeSetCount(const int vertexTx); void computeThreeCliqueCount(const int vertexTx);
bool canProcessVertex(const int vertexToCheck, const int vertexTx) const; bool canProcessVertex(const int vertexToCheck, const int vertexTx) const;
bool findCompleteSubgraph(const int vertex, const size_t targetSize); bool findClique(const int vertex, const size_t targetSize);
bool isSubgraphComplete(const std::vector<int>& neighbors, const std::vector<bool>& combination) const; bool isClique(const std::vector<int>& neighbors, const std::vector<bool>& combination) const;
std::string calcPassword(const std::vector<int>& neighbors, const std::vector<bool>& combination, std::string calcPassword(const std::vector<int>& neighbors, const std::vector<bool>& combination,
const int vertex) const; const int vertex) const;
}; };

View File

@ -17,6 +17,7 @@
#include <algorithm> #include <algorithm>
#include <numeric> #include <numeric>
#include <set>
const std::string LanParty::getPuzzleName() const const std::string LanParty::getPuzzleName() const
{ {
@ -40,7 +41,7 @@ void LanParty::finish()
const auto itTxEnd = labelMap_.upper_bound(getLastTxComputerName()); const auto itTxEnd = labelMap_.upper_bound(getLastTxComputerName());
while (itTx != itTxEnd) while (itTx != itTxEnd)
{ {
computeInterconnectedThreeSetCount(itTx->second); computeThreeCliqueCount(itTx->second);
targetCliqueNumber = std::max(targetCliqueNumber, lan_.getDegree(itTx->second)); targetCliqueNumber = std::max(targetCliqueNumber, lan_.getDegree(itTx->second));
++itTx; ++itTx;
} }
@ -54,7 +55,7 @@ void LanParty::finish()
auto itTx = labelMap_.lower_bound(getFirstTxComputerName()); auto itTx = labelMap_.lower_bound(getFirstTxComputerName());
while (!isFound && itTx != itTxEnd) while (!isFound && itTx != itTxEnd)
{ {
isFound = findCompleteSubgraph(itTx->second, targetCliqueNumber); isFound = findClique(itTx->second, targetCliqueNumber);
++itTx; ++itTx;
} }
--targetCliqueNumber; --targetCliqueNumber;
@ -86,7 +87,7 @@ int LanParty::findOrAddVertex(const std::string& vertexId)
} }
} }
void LanParty::computeInterconnectedThreeSetCount(const int vertexTx) void LanParty::computeThreeCliqueCount(const int vertexTx)
{ {
auto itFirstNeighbor = lan_.begin(vertexTx); auto itFirstNeighbor = lan_.begin(vertexTx);
while (itFirstNeighbor != lan_.end()) while (itFirstNeighbor != lan_.end())
@ -117,7 +118,7 @@ bool LanParty::canProcessVertex(const int vertexToCheck, const int vertexTx) con
return (label[0] != 't' || label > lan_.getVertexData(vertexTx)); return (label[0] != 't' || label > lan_.getVertexData(vertexTx));
} }
bool LanParty::findCompleteSubgraph(const int vertex, const size_t targetSize) bool LanParty::findClique(const int vertex, const size_t targetSize)
{ {
// Validates that the degree of the start vertex is actually high enough for the target clique size. // Validates that the degree of the start vertex is actually high enough for the target clique size.
if (targetSize > lan_.getDegree(vertex) + 1) if (targetSize > lan_.getDegree(vertex) + 1)
@ -141,7 +142,7 @@ bool LanParty::findCompleteSubgraph(const int vertex, const size_t targetSize)
do do
{ {
if (isSubgraphComplete(neighbors, combination)) if (isClique(neighbors, combination))
{ {
part2 = calcPassword(neighbors, combination, vertex); part2 = calcPassword(neighbors, combination, vertex);
return true; return true;
@ -151,7 +152,7 @@ bool LanParty::findCompleteSubgraph(const int vertex, const size_t targetSize)
return false; return false;
} }
bool LanParty::isSubgraphComplete(const std::vector<int>& neighbors, const std::vector<bool>& combination) const bool LanParty::isClique(const std::vector<int>& neighbors, const std::vector<bool>& combination) const
{ {
for (size_t i = 0; i < combination.size(); ++i) for (size_t i = 0; i < combination.size(); ++i)
{ {
@ -172,16 +173,15 @@ bool LanParty::isSubgraphComplete(const std::vector<int>& neighbors, const std::
std::string LanParty::calcPassword(const std::vector<int>& neighbors, const std::vector<bool>& combination, std::string LanParty::calcPassword(const std::vector<int>& neighbors, const std::vector<bool>& combination,
const int vertex) const const int vertex) const
{ {
std::vector<std::string> completeSubgraph{ lan_.getVertexData(vertex) }; std::set<std::string> clique{ lan_.getVertexData(vertex) };
for (size_t i = 0; i < combination.size(); ++i) for (size_t i = 0; i < combination.size(); ++i)
{ {
if (combination[i]) if (combination[i])
{ {
completeSubgraph.push_back(lan_.getVertexData(neighbors[i])); clique.insert(lan_.getVertexData(neighbors[i]));
} }
} }
std::sort(completeSubgraph.begin(), completeSubgraph.end()); return std::accumulate(++clique.begin(), clique.end(), *clique.begin(),
return std::accumulate(++completeSubgraph.begin(), completeSubgraph.end(), *completeSubgraph.begin(),
[](const std::string& acc, const std::string& x) { return acc + "," + x; }); [](const std::string& acc, const std::string& x) { return acc + "," + x; });
} }