Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
function g(v: integer): integer;
var
i: integer;
begin
result := 1;
if (vis2 and (1 shl (v - 1)) = 0) then
vis2 := vis2 + (1 shl (v - 1));
for i := 1 to n do
if (vis2 and (1 shl (i - 1)) = 0) and (matrix[v][i] = 1) then
result := result + g(i);
end;
function dfs(v, deep: integer): integer;
var
i, cnt, top: integer;
begin
vis := vis + (1 shl (v - 1));
result := get_ans_by_key(vis, v);
if result <> -1 then
exit;
result := deep;
global_ans := max(global_ans, result);
for i := 1 to n do
vis2[i] := vis[i];
cnt := g(v);
if deep + cnt - 1 > global_ans then begin
top := 0;
for i := 1 to n do
if (matrix[v][i] = 1) and (vis and (1 shl (i - 1)) = 0) then begin
inc(top);
res[top] := dfs2(i);
id[top] := i;
end;
if top <> 0 then begin
qsort(1, top);
for i := 1 to min(k, top) do
if (matrix[v][id[i]] = 1) and (vis and (1 shl (id[i] - 1)) = 0) then
result := max(result, dfs(id[i], deep + 1));
end;
end;
put_key(vis, v, result);
vis := vis - (1 shl (v - 1));
end;

Оптимизация перебора