POJ 1751[Highways]
果断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.