这题关键在建图,想了N久,最后还是去看了题解,哇塞!那些大牛们是怎么想到的啊>>>这想法,太美妙了~

详情请见http://ip96cns.blog.163.com/blog/static/170095192201117465473/

贴个程序//不过都没什么用啦,思路出来了,so easy!

program poj2226;
type
  node1=record
    x,y,next:integer;
  end;
  node2=record
    c:char;
    x,y:integer;
  end;
var
  g:array[1..2500] of node1;
  link,first:array[1..1251] of integer;
  used:array[1..1251] of boolean;
  a:array[1..50,1..50] of node2;
  n,m,i,ans,len:integer;
  f:boolean;
procedure init;
var
  i,j,r,c:integer;
begin
  readln(r,c);
  n:=0;
  for i:=1 to r do
  begin
    for j:=1 to c do
    begin
      read(a[i,j].c);
      if a[i,j].c='.' then continue
        else if (j=1) or (a[i,j-1].c='.') then
        begin
          inc(n);
          a[i,j].x:=n;
        end
        else a[i,j].x:=n;
    end;
    readln;
  end;
  for i:=1 to n do
    first[i]:=-1;
  m:=0;
  len:=0;
  for j:=1 to c do
    for i:=1 to r do
      if a[i,j].c='.' then continue
        else
        begin
          if (i=1) or (a[i-1,j].c='.') then inc(m);
          a[i,j].y:=m;
          inc(len);
          g[len].x:=a[i,j].x;
          g[len].y:=a[i,j].y;
          g[len].next:=first[g[len].x];
          first[g[len].x]:=len;
        end;
end;
function find(s:integer):boolean;
var
  temp:integer;
begin
  find:=true;
  temp:=first[s];
  while temp<>-1 do
  begin
    if not used[g[temp].y] then
    begin
      used[g[temp].y]:=true;
      if (link[g[temp].y]=0) or (find(link[g[temp].y])) then
      begin
        link[g[temp].y]:=s;
        exit;
      end;
    end;
    temp:=g[temp].next;
  end;
  find:=false;
end;
begin
  fillchar(g,sizeof(g),0);
  fillchar(link,sizeof(link),0);
  init;
  for i:=1 to n do
  begin
    fillchar(used,sizeof(used),false);
    f:=find(i);
  end;
  ans:=0;
  for i:=1 to m do
    if link[i]<>0 then inc(ans);
  writeln(ans);
end.