標籤:des style blog http color os io 資料
1232: [Usaco2008Nov]安慰奶牛cheerTime Limit: 10 Sec Memory Limit: 162 MB
Submit: 578 Solved: 403
[Submit][Status]Description
Farmer John變得非常懶, 他不想再繼續維護供奶牛之間供通行的道路. 道路被用來串連N (5 <= N <= 10,000)個牧場, 牧場被連續地編號為1..N. 每一個牧場都是一個奶牛的家. FJ計劃除去P(N-1 <= P <= 100,000)條道路中儘可能多的道路, 但是還要保持牧場之間的連通性. 你首先要決定那些道路是需要保留的N-1條道路. 第j條雙向道路串連了牧場S_j和E_j (1 <= S_j <= N; 1 <= E_j <= N; S_j != E_j), 而且走完它需要L_j (0 <= L_j <= 1,000)的時間. 沒有兩個牧場是被一條以上的道路所串連. 奶牛們非常傷心, 因為她們的交通系統被削減了. 你需要到每一個奶牛的住處去安慰她們. 每次你到達第i個牧場的時候(即使你已經到過), 你必須花去C_i (1 <= C_i <= 1,000)的時間和奶牛交談. 你每個晚上都會在同一個牧場(這是供你選擇的)過夜, 直到奶牛們都從悲傷中緩過神來. 在早上起來和晚上回去睡覺的時候, 你都需要和在你睡覺的牧場的奶牛交談一次. 這樣你才能完成你的交談任務. 假設Farmer John採納了你的建議, 請計算出使所有奶牛都被安慰的最少時間. 對於你前10次的提交, 你的程式會在一部分正式的測試資料上運行, 並且返回啟動並執行結果.
Input
* 第 1 行: 用空格隔開的兩個整數N和P * 第 2..N+1 行: 第i+1行包含了一個整數: C_i * 第 N+2..N+P+1 行: 第 N+j+1 行包含用空格隔開的三個整數: S_j, E_j 和 L_j
Output
第 1 行: 一個整數, 所需要的總時間(包含和在你所在的牧場的奶牛的兩次談話時間).
Sample Input5 7
10
10
20
6
30
1 2 5
2 3 5
2 4 12
3 4 17
2 5 15
3 5 6
4 5 12
Sample Output176
HINT
Source題解:
有的usaco題目用到的知識並不多,但思路很巧妙。
此題手工類比一下會發現 每條便一定會被走過兩次,所以我們可以 用 w[a[i]]+w[b[i]]+2*c[i] 來代替這條邊的權值,因為這是走這條邊真正的花費
做kruskall即可 最後再加上 min{w[i]}
代碼:
1 uses math; 2 var fa,a,b,c,w:array[0..120000] of longint; 3 i,j,n,m,ans:longint; 4 function find(x:longint):longint; 5 begin 6 if fa[x]<>x then fa[x]:=find(fa[x]); 7 exit(fa[x]); 8 end; 9 10 procedure sort(l,r:longint);11 var i,j,x,y:longint;12 begin13 i:=l;j:=r;x:=c[(i+j)>>1];14 repeat15 while c[i]<x do inc(i);16 while c[j]>x do dec(j);17 if i<=j then18 begin19 y:=c[i];c[i]:=c[j];c[j]:=y;20 y:=a[i];a[i]:=a[j];a[j]:=y;21 y:=b[i];b[i]:=b[j];b[j]:=y;22 inc(i);dec(j);23 end;24 until i>j;25 if i<r then sort(i,r);26 if j>l then sort(l,j);27 end;28 procedure init;29 begin30 readln(n,m);31 ans:=maxlongint;32 for i:=1 to n do begin readln(w[i]);ans:=min(ans,w[i]);end;33 for i:=1 to m do begin readln(a[i],b[i],c[i]);inc(c[i],c[i]+w[a[i]]+w[b[i]]);end;34 sort(1,m);35 end;36 procedure main;37 begin38 for i:=1 to n do fa[i]:=i;j:=1;39 for i:=1 to n-1 do40 begin41 while find(a[j])=find(b[j]) do inc(j);42 fa[find(a[j])]:=find(b[j]);43 inc(ans,c[j]);44 end;45 writeln(ans);46 end;47 begin48 assign(input,‘input.txt‘);assign(output,‘output.txt‘);49 reset(input);rewrite(output);50 init;51 main;52 close(input);close(output);53 end.
View Code