164 std::vector<Index> common_elements;
165 std::set_intersection(ids1.begin(), ids1.end(), ids2.begin(), ids2.end(),
166 std::back_inserter(common_elements));
167 std::vector<const Segment *> results;
168 if (common_elements.empty() || common_elements.size() > 1) {
171 Index molid = common_elements[0];
174 if (std::find(seg.getMoleculeIds().begin(), seg.getMoleculeIds().end(),
175 molid) != seg.getMoleculeIds().end()) {
176 results.push_back(&seg);
184 std::vector<const Segment *> results;
190 std::map<Index, std::vector<Index>> segment_adjacency;
192 for (
const Atom &atom : seg) {
193 if (!atom.hasExternalBond()) {
196 Index partner_segment_id = atom.getExternalBondPartnerSegmentId();
197 if (partner_segment_id == -1) {
200 segment_adjacency[seg.getId()].push_back(partner_segment_id);
206 std::map<Index, Index> predecessor;
207 std::set<Index> visited;
208 std::queue<Index> to_visit;
209 visited.insert(seg1.
getId());
210 to_visit.push(seg1.
getId());
212 while (!to_visit.empty() && !found) {
213 Index current = to_visit.front();
215 for (
Index neighbor : segment_adjacency[current]) {
216 if (visited.count(neighbor) > 0) {
219 visited.insert(neighbor);
220 predecessor[neighbor] = current;
221 if (neighbor == seg2.
getId()) {
225 to_visit.push(neighbor);
237 std::vector<Index> path_segment_ids;
239 while (current != seg1.
getId()) {
240 path_segment_ids.push_back(current);
241 current = predecessor.at(current);
243 std::reverse(path_segment_ids.begin(), path_segment_ids.end());
245 for (
Index segment_id : path_segment_ids) {