#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<std::pair<int, int>>& NetworkSet::GetNetworkGraph(int id) const {
return networks_.at(id);
}