劍魚行動
time limit:10000ms memory limit:65536k
total submit:93 accepted:79
case time limit:1000ms
description
給出n個點的座標,對它們建立乙個最小生成樹,代價就是連線它們的路徑的長度,現要求總長度最小。n的值在100以內,座標值在[-10000,10000].結果保留二位小數
input
5 ---------------5個點
0 0 ---------------5個點點的座標
0 1
1 1
1 0
0.5 0.5
output
2.83
sample input
sample output
source
zju
這一題和最小生成樹一樣。但輸入變一下,輸出保留兩位小數、
var
n,i,j,k,t:longint;
min,ans:real;
x,y,v:array[0..101]of real;
a:array[0..101,0..101]of real;
begin
readln(n);
for i:=1 to n do
begin
readln(x[i],y[i]);
for j:=1 to i-1 do
begin
a[i,j]:=sqrt(sqr(x[i]-x[j])+sqr(y[i]-y[j]));
a[j,i]:=a[i,j];
end;
end;
fillchar(v,sizeof(v),#0);
v[1]:=1;
for i:=1 to n-1 do
begin
min:=maxlongint;
for j:=1 to n do
if v[j]=1 then
for k:=1 to n do
if v[k]=0 then
if (a[j,k]0) then
begin
min:=a[j,k];
t:=k;
end;
if min<>maxlongint then
begin
ans:=ans+min;
v[t]:=1;
end;
end;
write(ans:0:2);
end.
方法2:(本方法從集合變成廣搜(擦不多),就是把每乙個點關聯起來,每列舉乙個點就更新(同化)父節點);
varn,i,j,k,q,p,t:longint;
tj,min:real;
x,y:array[0..200]of real;
f:array[0..200]of longint;
a:array[0..200,0..200]of real;
begin
readln(n);
for i:=1 to n do
readln(x[i],y[i]);
for i:=1 to n do
begin
for j:=1 to n do
begin
a[i,j]:=sqrt(sqr(x[i]-x[j])+sqr(y[i]-y[j]));
end;
end;
tj:=0;
for i:=1 to n do
f[i]:=i;
for k:=1 to n-1 do
begin
min:=maxlongint;
for i:=1 to n do
for j:=1 to n do
if (f[i]<>f[j])and(a[i,j]0) then
begin
min:=a[i,j];
p:=j;
q:=i;
end;
tj:=tj+min;
t:=f[p];
for i:=1 to n do
if f[i]=t then f[i]:=f[q];
end;
write(tj:0:2);
end.
劍魚行動 題解
給出n個點的座標,對它們建立乙個最小生成樹,代價就是連線它們的路徑的長度,現要求總長度最小。n的值在100以內,座標值在 10000,10000 結果保留二位小數 第一行 n nn 點的個數 接下來 n nn 行,n nn 個點的座標 最小總長度 inpu 50 0 0 11 1 1 00.5 0....
並查集 Kruskal 劍魚行動
ssl 1618 給出n個點的座標,對它們建立乙個最小生成樹,代價就是連線它們的路徑的長度,現要求總長度最小。n的值在100以內,座標值在 10000,10000 結果保留二位小數 5 0 0 0 1 1 1 1 0 0.5 0.52.83用kru skal kruskal kruska l演算法做...
ssl1618 劍魚行動
劍魚行動 time limit 10000ms memory limit 65536k total submit 103 accepted 86 case time limit 1000ms description 給出n個點的座標,對它們建立乙個最小生成樹,代價就是連線它們的路徑的長度,現要求總長...