p2326.pas

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

PAS
121
字号
PROGRAM p2326;

CONST
        maxn=1000;
        max=1e10;
        small=1e-7;

VAR
        n,m                     :Integer;
        name                    :array[1..maxn]of String;
        have                    :Extended;
        dis                     :array[1..maxn,1..maxn]of Extended;
        edge                    :array[1..maxn,0..maxn]of Integer;

FUNCTION Find(s:String):Integer;
var
        i                       :Integer;
begin
for i:=1 to n do
        if name[i]=s then
                begin
                find:=i;
                exit;
                end;
end;

PROCEDURE Readin;
var
        s,t                     :String;
        i,code,a,b              :Integer;
begin
readln(have);
readln(n);
for i:=1 to n do
        begin
        edge[i][0]:=0;
        readln(name[i]);
        end;
readln(m);
for i:=1 to m do
        begin
        readln(s);
        t:=copy(s,1,pos(' ',s)-1);
        a:=find(t);
        delete(s,1,pos(' ',s));
        t:=copy(s,1,pos(' ',s)-1);
        b:=find(t);
        delete(s,1,pos(' ',s));
        val(s,dis[a][b],code);
        dis[b][a]:=dis[a][b];
        inc(edge[a][0]);
        edge[a][edge[a][0]]:=b;
        inc(edge[b][0]);
        edge[b][edge[b][0]]:=a;
        end;
end;

PROCEDURE prim;
var

        mincost                         :array[1..maxn]of Extended;
        closet                          :array[1..maxn]of Integer;
        team                            :array[1..maxn]of Boolean;
        i,k                             :Integer;
        min,ans                         :Extended;
begin

{for i:=1 to n do
        begin
        for k:=1 to edge[i][0] do
                writeln(i,' ',edge[i][k],' ',dis[i][edge[i][k]]:0:3);
        writeln;
        end; }
ans:=0;

for i:=1 to n do mincost[i]:=max;
for i:=1 to edge[1][0] do
        begin
        mincost[edge[1][i]]:=dis[1][edge[1][i]];
        closet[edge[1][i]]:=1;
        end;

fillchar(team,sizeof(team),0);
team[1]:=true;
mincost[1]:=0;

repeat
        min:=max;
        k:=0;
        for i:=2 to n do
                if not team[i] and (mincost[i]<min) then
                        begin
                        min:=mincost[i];
                        k:=i;
                        end;

        if k<>0 then
                begin
                ans:=ans+min;
                team[k]:=true;
                for i:=1 to edge[k][0] do
                        if not team[edge[k][i]] and (dis[k][edge[k][i]]<mincost[edge[k][i]]) then
                                begin
                                mincost[edge[k][i]]:=dis[k][edge[k][i]];
                                closet[edge[k][i]]:=k;
                                end;
                end else break;
until false;
if ans<have+small then writeln('Need ',ans:0:1,' miles of cable')
        else writeln('Not enough cable');
end;

BEGIN
//assign(input,'p.in');
//reset(input);
while not eof do
        begin
        Readin;
        Prim;
        end;
END.

⌨️ 快捷键说明

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