x - $p2->x, $p1->y - $p2->y); } fscanf(STDIN, "%d", $n); $arr = [ ]; for ($i = 0; $i < $n; ++$i) { $p = new punto( ); fscanf(STDIN, "%f%f", $p->x, $p->y); $arr[] = $p; } $costos = [ ]; for ($i = 0; $i < $n; ++$i) { for ($j = 0; $j < $n; ++$j) { $costos[$i][$j] = distancia($arr[$i], $arr[$j]); } } $memoria = [ ]; for ($i = 0; $i < $n; ++$i) { $memoria[$i][(1 << $n) - 1] = $costos[$i][0]; } for ($v = (1 << $n) - 2; $v >= 0; --$v) { $grupos = [ ]; $tam = [ 0, 0 ]; for ($i = 0; $i < $n; ++$i) { $b = (bool)($v & (1 << $i)); $grupos[$b][$tam[$b]++] = $i; } for ($i = 0; $i < $tam[1]; ++$i) { $res = INF; for ($j = 0; $j < $tam[0]; ++$j) { $res = min($res, $costos[$grupos[1][$i]][$grupos[0][$j]] + $memoria[$grupos[0][$j]][$v | (1 << $grupos[0][$j])]); } $memoria[$grupos[1][$i]][$v] = $res; } } echo $memoria[0][1], "\n"; // php tsp.php < instancia.txt ?>