比赛 |
HAOI2009 模拟试题4 |
评测结果 |
AAAAAAAAAA |
题目名称 |
K- 联赛 |
最终得分 |
100 |
用户昵称 |
lc |
运行时间 |
0.000 s |
代码语言 |
Pascal |
内存使用 |
0.00 MiB |
提交时间 |
2009-04-24 11:12:38 |
显示代码纯文本
program day3_3;
const
maxn = 25;
maxT = 800;
Inf =100000000;
var
n,NN: longint;
maxflow,maxwi: longint;
S,T: longint;
btot,totmatch,sumleft: longint;
a: array[1..maxn,1..maxn] of longint;
w,f: array[1..maxn] of longint;
cost: array[1..maxT,1..maxT] of longint;
lable,last,q,ww: array[1..maxT] of longint;
ans: array[0..maxn] of longint;
procedure Init;
var
i,j: longint;
begin
readln(n);
for i :=1 to n do read(w[i],f[i]);
for i :=1 to n do if w[i]>maxwi then maxwi :=w[i];
for i :=1 to n do
for j :=1 to n do read(a[i,j]);
for i :=1 to n do
for j :=i+1 to n do inc(totmatch,a[i,j]);
end;
procedure make_graph;
var
i,j: longint;
begin
btot :=n;
for i :=1 to n do
for j :=i+1 to n do if a[i,j] > 0
then begin
inc(btot);
cost[btot,i] :=a[i,j]; //Ei-->i
cost[btot,j] :=a[i,j]; //Ei-->j
ww[btot] :=a[i,j]
end;
S :=btot+1; T :=btot+2;
for i :=n+1 to btot do cost[S,i] :=ww[i]; //S-->Ei
for i :=1 to n do cost[i,T] :=sumleft - w[i]; //i-->T
NN :=btot+2;
end;
function BFs :boolean;
var
head,tail,u,i: longint;
begin
fillchar(lable,sizeof(lable),$FF);
head :=1; tail :=1; q[1] :=S; lable[S] :=0;
repeat
u :=q[head];
for i :=1 to NN do if cost[u,i] >0
then if lable[i] = -1 then begin
lable[i] :=lable[u]+1;
inc(tail); q[tail]:=i;
if i = T then exit(true);
end;
inc(head);
until head > tail;
exit(false);
end;
procedure DFs;
var
top,u,i,r: longint;
begin
top :=1; q[1] :=S;
for i :=1 to NN do last[i] :=1;
while top > 0 do begin
u :=q[top];
if u <> T then begin
for i :=last[i] to NN do if (cost[u,i] >0) and (lable[i]=lable[u]+1)
then break;
last[u] :=i;
if (cost[u,i] > 0) and (lable[i]=lable[u]+1)
then begin
inc(top); q[top] :=i;
end
else begin
lable[u] :=-1; dec(top);
end;
end
else begin
r :=maxlongint;
for i :=1 to top-1 do if cost[q[i],q[i+1]] <r then r :=cost[q[i],q[i+1]];
inc(maxflow,r);
for i :=1 to top-1 do begin
inc(cost[q[i+1],q[i]],r);
dec(cost[q[i],q[i+1]],r);
end;
i :=1;
while cost[q[i],q[i+1]] > 0 do inc(i);
top :=i;
end;
end;
end;
procedure Dinic;
begin
maxflow :=0;
while BFS do DFS;
end;
procedure Main;
var
i,j: longint;
left: array[1..maxn] of longint;
begin
for i :=1 to n do begin
for j :=1 to n do left[j] :=a[i,j];
for j :=1 to n do begin
a[i,j] :=0; a[j,i] :=0;
end;
sumleft :=w[i]; for j :=1 to n do inc(sumleft,left[j]);
if sumleft<maxwi then begin
for j :=1 to n do begin
a[i,j] :=left[j]; a[j,i] :=left[j];
end;
continue;
end;
fillchar(cost,sizeof(cost),0);
make_graph;
Dinic;
if maxflow = totmatch - (sumleft-w[i])
then begin
inc(ans[0]); ans[ans[0]] :=i;
end;
for j :=1 to n do begin
a[i,j] :=left[j]; a[j,i] :=left[j];
end;
end;
end;
procedure Print;
var
i: longint;
begin
for i :=1 to ans[0]-1 do write(ans[i],' ');
writeln(ans[ans[0]]);
end;
begin
assign(input,'kleague.in'); reset(input);
assign(output,'kleague.out'); rewrite(output);
Init;
Main;
Print;
close(input); close(output);
end.