program kruskal_RQ;
type
node=record
p,s:longint;
v:longint;
end;
var
e:array[1..10000]of node;
f:array[1..1000]of longint;
i,j,n,m,tot,p:longint;
procedure Qsort(l,r:longint);
var
i,j,x,t:longint;
begin
i:=l; j:=r; x:=e[(i+j)div 2].v;
repeat
while e[i].v<x do inc(i);
while e[j].v>x do dec(j);
if i<=j then begin
t:=e[i].v; e[i].v:=e[j].v; e[j].v:=t;
t:=e[i].p; e[i].p:=e[j].p; e[j].p:=t;
t:=e[i].s; e[i].s:=e[j].s; e[j].s:=t;
inc(i); dec(j);
end;
until i>j;
if l<j then Qsort(l,j);
if i<r then Qsort(i,r);
end;
function find(x:longint):longint;
begin
if f[x]<>x then f[x]:=find(f[x]);
exit(f[x]);
end;
procedure union(x,y:integer);
var
rx,ry:integer;
begin
rx:=find(x);
ry:=find(y);
if rx<>ry then f[rx]:=ry;
end;
procedure Kruskal;
var
i,k:longint;
begin
k:=0;
for i:=1 to m do if find(e[i].p)<>find(e[i].s) then begin
inc(tot,e[i].v);
union(e[i].p,e[i].s);
inc(k);
if k=m-1 then exit;
end;
end;
begin
readln(n);
for i:=1 to n do begin
for j:=1 to n do begin
read(p);
if i<j then begin
inc(m);
e[m].p:=i; e[m].s:=j; e[m].v:=p;
end;
end;
readln;
end;
Qsort(1,m);
for i:=1 to n do f[i]:=i;
Kruskal;
writeln(tot);
end.
var
i,k:longint;
begin
k:=0;
for i:=1 to m do if find(e[i].p)<>find(e[i].s) then begin
inc(tot,e[i].v);
union(e[i].p,e[i].s);
inc(k);
if k=m-1 then exit;
end;
end;
最后的m-1应该是n-1吧?