hamilton algorithm