#include "network_set.h" void NetworkSet::Clear() { networks_.clear(); network_by_item_.clear(); } int NetworkSet::AddLink(int id1, int id2) { if (id2 > id1) { // Make sure id1 < id2 std::swap(id1, id2); } if (network_by_item_.count(id1)) { if (network_by_item_.count(id2)) { int network_id1 = network_by_item_[id1]; int network_id2 = network_by_item_[id2]; networks_[network_id1].emplace(id1, id2); if (network_id1 != network_id2) { for (const auto& [other_id1, other_id2] : networks_[network_id2]) { network_by_item_[other_id1] = network_id1; network_by_item_[other_id2] = network_id1; } networks_[network_id1].merge(networks_[network_id2]); networks_[network_id2].clear(); } return network_id1; } else { int network_id = network_by_item_[id1]; network_by_item_[id2] = network_id; networks_[network_id].emplace(id1, id2); return network_id; } } else { if (network_by_item_.count(id2)) { int network_id = network_by_item_[id2]; network_by_item_[id1] = network_id; networks_[network_id].emplace(id1, id2); return network_id; } else { int network_id = networks_.size(); network_by_item_[id1] = network_id; network_by_item_[id2] = network_id; networks_.emplace_back(); networks_[network_id] = {{id1, id2}}; return network_id; } } } bool NetworkSet::IsItemInNetwork(int id) const { return network_by_item_.count(id); } int NetworkSet::GetNetworkWithItem(int id) const { return network_by_item_.at(id); } const std::set>& NetworkSet::GetNetworkGraph(int id) const { return networks_.at(id); }