传送门
http://www.lydsy.com/JudgeOnline/problem.php?id=1083
题目大意
给定一棵树形图,求最小生成树
题解
要求里说最大边最小,其实prim就是贪心的思想,所以满足最大边最小,也就不用二分答案了
var
x:array[0..1000000,1..3]of longint;
y,fa:array[0..400]of longint;
i,j,k:longint;
n,m,s,max,a,b:longint;
procedure sort(l,r:longint);
var i,j,k,a,b:longint;
begin
i:=l; j:=r; a:=x[(l+r) div 2,3];
repeat
while x[i,3]<a do inc(i);
while a<x[j,3] do dec(j);
if not(i>j) then
begin
for k:=1 to 3 do
begin b:=x[i,k]; x[i,k]:=x[j,k]; x[j,k]:=b; end;
inc(i); dec(j);
end;
until i>j;
if l<j then sort(l,j);
if i<r then sort(i,r);
end;
function get(a:longint):longint;
begin
if fa[a]=a then exit(a);
fa[a]:=get(fa[a]);
exit(fa[a]);
end;
begin
readln(n,m);
for i:=1 to m do
readln(x[i,1],x[i,2],x[i,3]);
sort(1,m); {x[i,3]}
for i:=1 to n do
begin fa[i]:=i; end;
s:=0;
for i:=1 to m do
begin
a:=x[i,1]; b:=x[i,2];
if get(a)<>get(b)
then begin fa[fa[a]]:=fa[b]; inc(s); max:=x[i,3]; end;
end;
writeln(s,' ',max);
end.