p1364.pas

来自「高手写的所有acm例程 在acm.zju.edu.cn 上的题目的例程」· PAS 代码 · 共 124 行

PAS
124
字号
PROGRAM p1364;

VAR
        n,m,t,goal              :Integer;
        dis                     :array[0..201,0..201]of Integer;
        maxget,puss             :array[0..201]of Integer;

PROCEDURE Init;
var
        i,a,b,c                 :Integer;
begin
fillchar(dis,sizeof(dis),0);
for i:=1 to t do
        begin
        readln(a,b,c);
        inc(b);
        inc(c);
	if (b=1) or (c=1) then continue;
        dis[b,c+n]:=1;
        end;
for i:=1 to n do  dis[0,i]:=1;
for i:=n+1 to m+n  do dis[i,n+m+1]:=1;
end;

PROCEDURE Dij;
var
        i,j,min,max,k           :Integer;
        team                    :array[0..201]of Boolean;
begin
for i:=0 to goal do
        begin
        maxget[i]:=dis[0,i];
        puss[i]:=0;
        end;

fillchar(team,sizeof(team),0);
maxget[0]:=maxint div 2;

repeat
        max:=0;
        for i:=0 to goal-1 do
                if not team[i] and (maxget[i]>max) then
                        begin
                        max:=maxget[i];
                        k:=i;
                        end;
        if max<>0 then
                begin
                team[k]:=true;
                for i:=1 to goal do
                        if not team[i]  then
                                begin
                                if maxget[k]>dis[k,i] then min:=dis[k,i] else min:=maxget[k];
                                if min>maxget[i] then
                                        begin
                                        maxget[i]:=min;
                                        puss[i]:=k;
                                        end;
                                end;
                end else break;
        //if k=goal then break;
until false;
end;

{PROCEDURE Print;
var
        i,j                     :Integer;
begin
for i:=0 to goal do
        begin
        for j:=0 to goal do write(dis[i][j],' ');
        writeln;
        end;
end; }

PROCEDURE Main;
var
        i,j,ans                   :Integer;
begin

goal:=n+m+1;


{for i:=1 to goal do
        begin
        for j:=1 to goal do  write(dis[i,j],' ');
        writeln;
        end; }


dij;

while (maxget[goal]>0) do
        begin
        i:=goal;
        while (i<>0) do
                begin
                dec(dis[puss[i]][i],maxget[goal]);
                inc(dis[i][puss[i]],maxget[goal]);
                i:=puss[i];
                end;
        dij;
        end;

ans:=0;
for i:=1 to goal-1 do
        inc(ans,dis[goal][i]);
writeln(ans);
end;


BEGIN
//assign(input,'p.in');
//reset(input);
read(n);
while (n<>0) do
        begin
        readln(m,t);
        Init;
        Main;
        read(n);
        end;
END.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?