polynomial-time algorithm