Polynomial-time algorithm