3 ms·
Notwithstanding the limitation of assuming the graph is embedded in a coordinate space where you can try to measure angles, I think this algorithm still doesn't
by cvoss 2y ago
Notwithstanding the limitation of assuming the graph is embedded in a coordinate space where you can try to measure angles, I think this algorithm still doesn't work.
I may be missing a detail, but it seems to fail on a graph consisting of a loop with some extra edges branching off the loop toward its interior and some edges branching off toward the exterior. The left hand walk hits a dead end in one branch, and the right hand walk dead ends in the other, no matter where on the loop you start (except for some special cases).
Edit: strengthening the proposed counterexample
- vouwfietsman 2y agoHmm I'm having a hard time visualizing your counter example, I'll try to think of it some more. An important detail I left out though is that in my problem sets edges do not cross, which I suppose simplifies the entire problem a lot :-)
- mrgoldenbrown 2y agoI think you are trying to say your method only works if the graph is "planar", ie it can be drawn on a flat piece of paper with no lines crossing.
- vouwfietsman 2y agoIndeed, thanks for the clarification!
- eigenket 2y agoIf I understand your algorithm correctly I think it fails on this graph (drawn on my phone, using an online implementation of Paint). https://imgur.com/a/ihPrwrX https://imgur.com/a/ihPrwrX I think this is roughly the counterexample the person above was suggesting.
- vouwfietsman 2y agoAha! Yes to fix these cases a bit of bookkeeping is needed: a protruding edge like that would force the "walking" to back up, because its a dead end indeed. However, it also immediately means such an edge is not part of any loops, can be marked as such, and ignored upon retracing the steps. It's an edge case that should be handled, but does not prevent the general algo from working.
- eigenket 2y agoAh yeah, if you're not trying to identify all loops but just check if some loops exist then that works. I think you can dispense with the "walking around taking clockwise/anticlockwise edges" part though. If you repeatedly do the "remove all nodes with only 1 edge going to them" step then you've already identified whether or not at least one loop exists.
- vouwfietsman 2y agoRepeatedly removing those edges would help indeed! I am interested in finding the loops, but in the example provided the "dead end" edges do not contribute to the loop. Officially a loop is not allowed to contain the same vertex twice (besides start/end), otherwise any sequence of vertices could be considered a loop just by repeating them in reverse order. However, indeed it remains true that it does not find all loops, only the smallest set of loops that cover all edges.