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.