⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ex_other.pas

📁 tongji acm-online judge solution
💻 PAS
字号:
const maxn=20; maxm=maxn*2+1;

type Tlink=array[1..maxm] of integer;

var a:array[1..maxm,1..maxm] of boolean;
    link:Tlink;
    cover:array[1..maxm] of boolean;
    n,m,tot:integer;
    times:integer;
    ans:array[1..maxm] of Tlink;

procedure init;
  var i,j:integer;
      c:char;
  begin
    readln(n); m:=n*2+1;
    for i:=1 to m do
      begin
        for j:=1 to m do
          begin
            read(c);
            if c='+' then a[i,j]:=true else a[i,j]:=false;
          end;
        readln;
      end;

    tot:=0;
    for i:=1 to m do for j:=1 to m do if a[i,j] then inc(tot);
    times:=0;
  end;

function find(i:integer):boolean;
  var k,q:integer;
  begin
    for k:=1 to m do
      if a[i,k] and not cover[k] then
         begin
           q:=link[k]; link[k]:=i; cover[k]:=true;
           if (q=0) or find(q) then exit(true);
           link[k]:=q;
         end;
    exit(false);
  end;

function maxmatch:integer;
  var i,match:integer;
  begin
    fillchar(link,sizeof(link),0);
    for i:=1 to m do
      begin
        fillchar(cover,sizeof(cover),false);
        find(i);
      end;

    match:=0;
    for i:=1 to m do
      if link[i]<>0 then inc(match);
    exit(match);
  end;

procedure updata;
  var i,j:integer;
      used:Tlink;
  begin
    fillchar(used,sizeof(used),0);
    for i:=1 to m do if link[i]<>0 then used[link[i]]:=i;
    for i:=1 to m do if link[i]=0 then
      for j:=1 to m do if used[j]=0 then begin link[i]:=j; used[j]:=i; end;
    inc(times);
    ans[times]:=used;

    for j:=1 to m do
      begin
        i:=link[j];
        a[i,j]:=not a[i,j];
      end;
  end;

procedure work;
  var del:integer;
  begin
    repeat
      del:=maxmatch;
      if del<=n then break;
      dec(tot,del-(m-del));
      updata;
    until false;
  end;

procedure out;
  var i,j:integer;
  begin
    if tot>2*n then writeln('No solution')
    else begin
           writeln('There is solution:');
           for i:=1 to times do
             begin
               for j:=1 to m-1 do write(ans[i][j],' '); writeln(ans[i][m]);
             end;
         end;
  end;

begin
//assign(input,'1092.in'); reset(input);
  init;
  work;
  out;
end. 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -