您的位置:首页 > 其它

poj2060 Taxi Cab Scheme

2013-06-13 14:00 411 查看
这道题依然是一道裸的最短路径覆盖,注意建图。

建图:以每个任务为节点,若是从任务i能在规定的时间内到达任务j,则从i连一条边到j。

const MAXN=500;
var
tc,n:longint;
a,as,ae:array[1..MAXN,1..2]of longint;
g:array[1..MAXN,1..MAXN]of longint;
match,t:array[1..MAXN]of longint;
h:array[1..MAXN]of boolean;
procedure init;
var i,j,h,m:longint;s:string[5];
begin
fillchar(t,sizeof(t),0);
fillchar(match,sizeof(match),0);
readln(n);
for i:=1 to n do
begin
readln(s,as[i][1],as[i][2],ae[i][1],ae[i][2]);
val(copy(s,1,2),h);
delete(s,1,3);
val(s,m);
a[i][1]:=h*60+m;
a[i][2]:=a[i][1]+abs(as[i][1]-ae[i][1])+abs(as[i][2]-ae[i][2]);
end;
for i:=1 to n-1 do
for j:=i+1 to n do
begin
if(a[i][2]+abs(as[j][1]-ae[i][1])+abs(as[j][2]-ae[i][2])<a[j][1])then
begin
inc(t[i]);
g[i,t[i]]:=j;
end;
end;
end;
function check(k:longint):boolean;
var i:longint;
begin
for i:=1 to t[k] do
if(not h[g[k,i]])then
begin
h[g[k,i]]:=true;
if(match[g[k,i]]=0)or(check(match[g[k,i]]))then
begin
match[g[k,i]]:=k;
exit(true);
end;
end;
exit(false);
end;
function hungarian:longint;
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;
exit(ans);
end;
begin
readln(tc);
while(tc<>0)do
begin
dec(tc);
init;
writeln(n-hungarian);
end;
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息