POJ1849 Two——贪心——Pku1849
生活随笔
收集整理的這篇文章主要介紹了
POJ1849 Two——贪心——Pku1849
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
類似于樹形動態規劃的貪心。題目大意:
這個城市由節點和連接節點的街道組成,街道是雙向的。此刻大雪覆蓋了這個城市,市長確定了一些街道要將它們清掃干凈,這些街道的確定保證所有節點可以通過它們連通而且街道數目盡可能小。有兩臺相同的掃雪機S和M,它們的起點在同一個節點上。
所有被確定的街道必須至少被一臺掃雪機經過,才能完成清掃任務,完成任務后S和M可以在原地停下,不必集合到某一點。掃雪機的行進是需要耗費油量的(即使掃雪機行駛的是已被掃凈的街道),因此掃雪機行進的總距離越小越好,你需要計算兩臺掃雪機完成任務的最小總行進距離。
?
{以上感謝鐸鐸大牛提供的翻譯}
?
解法:
首先從根節點出發找到一條最長的鏈,然后將這條鏈上路徑的長度len全部設為-len
再從根節點出發找到一條最長的連
樹中每條邊的長度之和*2-兩條鏈的長度之和就是答案。
?
貪心證明:顯然,畫畫圖就明白了
?
CODE
Program Two;//By_thispoet Constmaxn=300000; Varp,q,i,j,k,m,n,s,tmp,ans :Longint;pre,other,last,len :Array[0..maxn]of Longint;size,father,deal,res,kset :Array[0..maxn]of Longint;flag,v :Array[0..maxn]of Boolean;Procedure Dfs(i:Longint); var j,k:Longint; beginj:=last[i];while j<>0 dobegink:=other[j];if k<>father[i] thenbeginfather[k]:=i;if flag[k] then size[k]:=size[i]+len[j] elsesize[k]:=size[i]-len[j];Dfs(k);end;j:=pre[j];end;end;BEGINreadln(n,s);for i:=1 to n-1 dobeginreadln(p,q,m);inc(k);pre[k]:=last[p];last[p]:=k;other[k]:=q;len[k]:=m;inc(k);pre[k]:=last[q];last[q]:=k;other[k]:=p;len[k]:=m;inc(ans,m*2);end;fillchar(flag,sizeof(flag),1);size[s]:=0;Dfs(s);tmp:=1;for i:=2 to n doif size[i]>size[tmp] then tmp:=i;p:=size[tmp];while tmp<>s dobeginj:=last[tmp];while other[j]<>father[tmp] do j:=pre[j];flag[tmp]:=false;tmp:=father[tmp];end;Dfs(s);tmp:=1;for i:=2 to n doif size[i]>size[tmp] then tmp:=i;inc(p,size[tmp]);dec(ans,p);writeln(ans);END.轉載于:https://www.cnblogs.com/Thispoet/archive/2011/09/11/2173636.html
總結
以上是生活随笔為你收集整理的POJ1849 Two——贪心——Pku1849的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTML5将重塑Web世界?,互联网营销
- 下一篇: JavaWeb之文件上传