这题关键在建图,想了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.