您的位置:首页 > 其它

poj2536二分图匹配

2013-06-04 19:32 246 查看
又是一道二分图匹配的裸题,其实只要把每只地鼠和其能跑到的洞穴连条边后用匈牙利算法即可。

注意题目要的是不能跑到洞穴的地鼠数!!

var
n,m,sec,v:longint;
a:array[1..100,1..100]of longint;
s,match:array[1..100]of longint;
h:array[1..100]of boolean;
procedure init;
var
i,j,q:longint;t:double;
dg,dh:array[1..100,1..2]of double;
begin
for i:=1 to n do readln(dg[i,1],dg[i,2]);
for i:=1 to m do readln(dh[i,1],dh[i,2]);
q:=sec*v;
for i:=1 to n do
begin
s[i]:=0;
for j:=1 to m do
begin
t:=sqrt(sqr(dh[j,1]-dg[i,1])+sqr(dh[j,2]-dg[i,2]));
if(t<=q)then
begin
inc(s[i]);
a[i,s[i]]:=j;
end;
end;
end;
end;
function check(k:longint):boolean;
var i:longint;
begin
for i:=1 to s[k] do
if(not h[a[k,i]])then
begin
h[a[k,i]]:=true;
if(match[a[k,i]]=0)or(check(match[a[k,i]]))then
begin
match[a[k,i]]:=k;
exit(true);
end;
end;
exit(false);
end;
procedure hungarian;
var i,ans:longint;
begin
ans:=0;
for i:=1 to n do
begin
fillchar(h,sizeof(h),0);
if(check(i))then inc(ans);
end;
writeln(n-ans);
end;
begin
readln(n,m,sec,v);
while(not eof)do
begin
init;
fillchar(match,sizeof(match),0);
hungarian;
readln(n,m,sec,v);
end;
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  POJ