果断Prim不解释。其实Kruskal也可以,刚开始写的时候鉴于内存没敢写。
Const
maxn=750;
Var
codes:array[1..maxn,1..2]of longint;
d:array[1..maxn,1..maxn]of longint;
lowcost,pre:array[1..maxn]of longint;
i,j,n:longint;
Procedure prim;
var
i,j,k,dist,sum,min,q,x,y:longint;
begin
fillchar(d,sizeof(d),0);
for i:=1 to n-1 do
for j:=i+1 to n do
begin
dist:=(codes[i,1]-codes[j,1])*(codes[i,1]-codes[j,1])+(codes[i,2]-codes[j,2])*(codes[i,2]-codes[j,2]);
d[i,j]:=dist;
d[j,i]:=dist;
end;
readln(q);
for i:=1 to q do
begin
readln(x,y);
d[x,y]:=0;
d[y,x]:=0;
end;
sum:=0;
lowcost[1]:=-1;
for i:=2 to n do
begin
lowcost[i]:=d[1,i];
pre[i]:=1;
end;
for i:=1 to n-1 do
begin
min:=maxlongint;
for k:=1 to n do
begin
if (lowcost[k]<>-1)and(lowcost[k]<min) then
begin
j:=k;
min:=lowcost[k];
end;
end;
if min<>0 then writeln(pre[j],' ',j);
sum:=sum+min;
lowcost[j]:=-1;
for k:=1 to n do if d[j,k]<lowcost[k] then
begin
lowcost[k]:=d[j,k];
pre[k]:=j;
end;
end;
end;
BEgin
readln(n);
for i:=1 to n do
begin
for j:=1 to 2 do
read(codes[i,j]);
readln;
end;
prim;
End.