您的位置:首页 > 大数据 > 人工智能

poj3216 Repairing Company

2013-06-13 14:22 429 查看
这道题依然是最小路径覆盖裸题,以每个任务为节点建立二分图,之后再求最大匹配数,然后再用总任务数减去最大匹配数即可。
var
q,m:longint;
a:array[1..200,1..3]of longint;
dis:array[1..20,1..20]of longint;
g:array[1..200,1..200]of longint;
t,match:array[1..200]of longint;
h:array[1..200]of boolean;
procedure init;
var i,j,k:longint;
begin
fillchar(dis,sizeof(dis),0);
fillchar(t,sizeof(t),0);
fillchar(match,sizeof(match),0);
for i:=1 to q do
for j:=1 to q do
begin
read(dis[i,j]);
if(dis[i,j]=-1)then dis[i,j]:=maxlongint>>2;
end;
for i:=1 to q do dis[i,i]:=0;
for k:=1 to q do
for i:=1 to q do
for j:=1 to q do
if(dis[i,k]+dis[k,j]<dis[i,j])then dis[i,j]:=dis[i,k]+dis[k,j];
for i:=1 to m do
begin
readln(a[i][1],a[i][2],a[i][3]);
a[i][3]:=a[i][2]+a[i][3];
end;
for i:=1to m do
for j:=1 to m do
if(i<>j)then
begin
if(a[i][3]+dis[a[i][1],a[j][1]]<=a[j][2])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 m do
begin
fillchar(h,sizeof(h),0);
if(check(i))then inc(ans);
end;
exit(ans);
end;
begin
readln(q,m);
while(q<>0)do
begin
init;
writeln(m-hungarian);
readln(q,m);
end;
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息