BZOJ1232: [Usaco2008Nov]安慰奶牛cheer

來源:互聯網
上載者:User

標籤: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

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.