带有限制的生成树
首先不难想到二分答案转化为判定性问题
假设二分出了一个答案p,
首先我们先考虑建一级公路。
由于一级公路费用是大于二级公路的,所以对于那些一级公路花费<=p的道路,
不难想到让他们建一级公路显然更合适。
如果能建一级公路的建道路数>=k
并且再选择二级公路能选到n-1条,说明答案可行
注意这里的道路选择一定要满足生成树的性质,所以我们要加入并查集优化
type node=record
x,y,c1,c2:longint;
end; var a:array[..] of node;
fa,d:array[..] of longint;
mid,i,n,k,l,r,ans,m:longint; function getf(x:longint):longint;
begin
if fa[x]<>x then fa[x]:=getf(fa[x]);
exit(fa[x]);
end; function check(p:longint):boolean;
var s,i,k1,k2:longint;
begin
for i:= to n do
begin
d[i]:=;
fa[i]:=i;
end;
s:=;
for i:= to m do
if a[i].c1<=p then
begin
k1:=getf(a[i].x);
k2:=getf(a[i].y);
if k1<>k2 then
begin
if d[k1]>d[k2] then fa[k2]:=k1
else begin
fa[k1]:=k2;
if d[k1]=d[k2] then inc(d[k2]);
end;
inc(s);
end;
end;
if s<k then exit(false);
if s=n- then exit(true);
for i:= to m do
if (a[i].c2<=p) and (a[i].c1>p) then
begin
k1:=getf(a[i].x);
k2:=getf(a[i].y);
if k1<>k2 then
begin
if d[k1]>d[k2] then fa[k2]:=k1
else begin
fa[k1]:=k2;
if d[k1]=d[k2] then inc(d[k2]);
end;
inc(s);
if s=n- then exit(true);
end;
end;
exit(false);
end; begin
readln(n,k,m);
l:=;
for i:= to m- do
begin
with a[i] do
begin
readln(x,y,c1,c2);
end;
if a[i].c1>r then r:=a[i].c1;
if a[i].c2<l then l:=a[i].c2;
end;
ans:=r;
while l<=r do
begin
mid:=(l+r) shr ;
if check(mid) then
begin
ans:=mid;
r:=mid-;
end
else l:=mid+;
end;
writeln(ans);
end.