A.拆地毯

题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOIP模拟赛)/拆地毯

题解:按最大生成树顺序加k条边即可

代码:

 1 const maxn=100000+1000;
 2 var c:array[0..maxn] of int64;
 3     fa,a,b:array[0..maxn] of longint;
 4     i,j,n,m,k:longint;
 5     ans:int64;
 6 function find(x:longint):longint;
 7  begin
 8  if fa[x]<>x then fa[x]:=find(fa[x]);
 9  exit(fa[x]);
10  end;
11 
12 procedure sort(l,r:longint);
13  var i,j:longint;x,y:int64;
14  begin
15  i:=l;j:=r;x:=c[(i+j)>>1];
16  repeat
17   while c[i]>x do inc(i);
18   while c[j]<x do dec(j);
19   if i<=j then
20    begin
21    y:=a[i];a[i]:=a[j];a[j]:=y;
22    y:=b[i];b[i]:=b[j];b[j]:=y;
23    y:=c[i];c[i]:=c[j];c[j]:=y;
24    inc(i);dec(j);
25    end;
26  until i>j;
27  if i<r then sort(i,r);
28  if j>l then sort(l,j);
29  end;
30 procedure init;
31  begin
32    readln(n,m,k);
33    for i:=1 to m do readln(a[i],b[i],c[i]);
34  end;
35 procedure main;
36  begin
37   sort(1,m);
38   for i:=1 to n do fa[i]:=i;
39   j:=1;
40   ans:=0;
41   for i:=1 to k do
42    begin
43      while (find(a[j])=find(b[j])) do inc(j);
44      fa[find(a[j])]:=find(b[j]);
45      inc(ans,c[j]);
46    end;
47   writeln(ans);
48  end;
49 
50 begin
51   init;
52   main;
53 end.     
View Code

相关文章: