poj2536二分图匹配

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

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


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.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值