如果发现广告等破坏行为,请尽量将条目恢复到较早的版本而不是把相应内容直接删除,谢谢合作。

URAL/1063

来自"NOCOW"

跳转到: 导航, 搜索

迭代深搜

program cao;
const
  maxn=6;
 
var
  map:array[0..maxn,0..maxn] of longint;
  used,flag:array[0..maxn] of boolean;
  d,x,y:array[0..10000] of longint;
  a,b,c,e,f,g,h,i,j,k,l,n,m,p,q,ans,now:longint;
 
procedure init;
begin
  read(n);
  for i:=1 to n do
  begin
    read(a,b);
    inc(map[a,b]);
    inc(map[b,a]);
    used[a]:=true;
    used[b]:=true;
    inc(d[a]);
    inc(d[b]);
  end;
end;
 
function max(a,b:longint):longint;
begin
  if a>b then exit(a) else exit(b);
end;
 
function dfs(v:longint):longint;
var
  t,i:longint;
begin
  flag[v]:=true;
  t:=1;
  for i:=1 to maxn do
    if (flag[i]=false)and(map[v,i]>0) then
      t:=t+dfs(i);
  exit(t);
end;
 
function ok(depth:longint):boolean;
var
  i,j,k,l:longint;
begin
  k:=0;
  j:=0;
  for i:=1 to maxn do
    if used[i] then
    begin
      l:=i;
      break;
    end;
  for i:=i to maxn do
    if used[i] then
    begin
      inc(k);
      if odd(d[i]) then
      begin
        inc(j);
        l:=i;
        if j>2 then exit(false);
      end;
    end;
  fillchar(flag,sizeof(flag),0);
  if dfs(l)=k then exit(true)
  else exit(false);
end;
 
function search(depth:longint):boolean;
var
  i,j:longint;
begin
  if (now=ans)and(ok(depth)) then
  begin
    p:=depth-1;
    exit(true);
  end;
  for i:=x[depth-1] to maxn do
    if used[i] then
      for j:=max(y[depth-1],i+1) to maxn do
        if (used[j])and(i+j+now<=ans) then
        begin
          x[depth]:=i;
          y[depth]:=j;
          inc(d[i]);
          inc(d[j]);
          inc(map[i,j]);
          inc(map[j,i]);
          inc(now,i+j);
          if search(depth+1) then exit(true);
          dec(d[i]);
          dec(d[j]);
          dec(map[i,j]);
          dec(map[j,i]);
          dec(now,i+j);
        end;
  exit(false);
end;
 
procedure main;
begin
  ans:=0;
  x[0]:=1;
  y[0]:=1;
  while not(search(1)) do
  begin
    now:=0;
    inc(ans);
  end;
end;
 
procedure print;
begin
  writeln(ans);
  writeln(p);
  for i:=1 to p do
    writeln(x[i],‘ ‘,y[i]);
end;
 
begin
  init;
  main;
  print;
end.
个人工具