题目
Description
你有一个n个点m条边的森林,编号从0开始,边有边权,你现在要添加若干边权为L的边,满足:
1、最后n个点构成一颗树。
2、这棵树的直径尽量小。
请你求出这个最小的直径是多少。
Input
第一行三个整数n,m,L。
接下来m行,每行三个整数u,v,w,表示u和v之间有长为w的边。
Output
一行一个整数,表示最小直径的长度。
Sample Input
12 8 2
0 8 4
8 2 2
2 7 4
5 11 3
5 1 7
1 3 1
1 9 5
10 6 3
Sample Output
18
Data Constraint
对于20%的数据:n<=5;
对于60%的数据:n<=2000;
对于100%的数据:n<=50000,m
题解
比较感性而且显然的,我们可以先在每一颗树上找到一个离它最远的点最近的点,然后把每一颗树中的这样的点连起来变成一棵树,这棵树的直径就是最小的直径
贴代码
var
a:array[0..150005,1..3]of longint;
b:array[0..150005,1..2]of longint;
ct,now:array[0..100005]of longint;
cc:array[0..50005,1..4]of longint;
bz,bq:array[0..50005]of boolean;
h:array[0..200005]of longint;
i,j,k,l,m,n,x,y,z,t1,t2,ans,ma1,ma2:longint;
Function Max(x,y:longint):longint;
begin
if x>y then exit(x) else exit(y);
end;
procedure qsort(l,r:longint);