158 std::vector<Index> common_elements;
159 std::set_intersection(ids1.begin(), ids1.end(), ids2.begin(), ids2.end(),
160 std::back_inserter(common_elements));
161 std::vector<const Segment *> results;
162 if (common_elements.empty() || common_elements.size() > 1) {
165 Index molid = common_elements[0];
168 if (std::find(seg.getMoleculeIds().begin(), seg.getMoleculeIds().end(),
169 molid) != seg.getMoleculeIds().end()) {
170 results.push_back(&seg);
178 std::vector<const Segment *> results;
189 std::map<Index, std::vector<Index>> segment_adjacency;
191 for (
const Atom &atom : seg) {
192 if (!atom.hasExternalBond()) {
195 Index partner_segment_id = atom.getExternalBondPartnerSegmentId();
196 if (partner_segment_id == -1) {
199 segment_adjacency[seg.getId()].push_back(partner_segment_id);
208 std::map<Index, Index> predecessor;
209 std::set<Index> visited;
210 std::queue<Index> to_visit;
211 visited.insert(seg1.
getId());
212 to_visit.push(seg1.
getId());
214 while (!to_visit.empty() && !found) {
215 Index current = to_visit.front();
217 for (
Index neighbor : segment_adjacency[current]) {
218 if (visited.count(neighbor) > 0) {
221 visited.insert(neighbor);
222 predecessor[neighbor] = current;
223 if (neighbor == seg2.
getId()) {
227 to_visit.push(neighbor);
248 std::vector<Index> path_segment_ids;
250 while (current != seg1.
getId()) {
251 path_segment_ids.push_back(current);
252 current = predecessor.at(current);
254 std::reverse(path_segment_ids.begin(), path_segment_ids.end());
256 for (
Index segment_id : path_segment_ids) {