BLACK CAT PROGRAMMER

Tortoise and Hare

'''

This implements simple tortoise and hare algorithm which is a cycle detection algorithm

input:
number of nodes
<source node id> <destination ndoe id>
<source node id> <destination ndoe id>
...


'''

import sys

class Node:
  def __init__(self, pos):
    self.cur_pos = pos
    self.next_node = None

def find_cyclic(start_node):
  tortoise = start_node
  hare = start_node
  while tortoise.next_node and hare.next_node.next_node:
    tortoise = tortoise.next_node
    hare = hare.next_node.next_node

    if tortoise.cur_pos == hare.cur_pos:
      tortoise = start_node
      while tortoise.cur_pos != hare.cur_pos:
        tortoise = tortoise.next_node
        hare = hare.next_node

      return tortoise
  return False

node_count = int(input())
node_list = [Node(i) for i in range(node_count)]

for _ in range(node_count):
  line = input()
  line_arr = line.strip().split(" ")
  src = int(line_arr[0])
  dest = int(line_arr[1])
  node_list[src].next_node = node_list[dest]


# debug
node = node_list[0]
print("{} -> {}".format(node.cur_pos, node.next_node.cur_pos))
count = 0
while node.next_node and count < len(line):
  node = node.next_node
  print("{} -> {}".format(node.cur_pos, node.next_node.cur_pos))
  count+=1
  
meetup = find_cyclic(node_list[0])
print("meet up: {}".format(meetup.cur_pos))
          

Ref: https://medium.com/@tuvo1106/the-tortoise-and-the-hare-floyds-algorithm-87badf5f7d41

Posted in coding, notes