description
2023年,人類在火星上建立了乙個龐大的基地群,總共有n個基地。起初為了節約材料,人類只修建了n-1條道路來連線這些基地,並且每兩個基地都能夠通過道路到達,所以所有的基地形成了乙個巨大的樹狀結構。如果基地a到基地b至少要經過d條道路的話,我們稱基地a到基地b的距離為d。由於火星上非常乾燥,經常引發火災,人類決定在火星上修建若干個消防局。消防局只能修建在基地裡,每個消防局有能力撲滅與它距離不超過2的基地的火災。你的任務是計算至少要修建多少個消防局才能夠確保火星上所有的基地在發生火災時,消防隊有能力及時撲滅火災。input
輸入檔案的第一行為n,表示火星上基地的數目。接下來的n-1行每行有乙個正整數,其中檔案第i行的正整數為a[i],表示從編號為i的基地到編號為a[i]的基地之間有一條道路,為了更加簡潔的描述樹狀結構的基地群,有a[i]<i。output
輸出檔案僅有乙個正整數,表示至少要設立多少個消防局才有能力及時撲滅任何基地發生的火災。sample input
6sample output 題解1 2
3 4
5
開始想著樹形dp,然後敲了乙個弱雞**發現掛了。。再仔細一想,貪心666每個消防局可以管理2個點,那麼我們隔4個點放消防局就是最優的!
設f[x]為x到最近的消防局的距離,然後特殊處理一下葉子節點
哦,開始的點如果最近的消防局>3,那麼也只能放乙個消防局了
#include
#include
#include
#include
#include
using
namespace
std;
struct node
a[210000];int len,last[210000];
int ans;
void ins(int x,int y)
int f[110000],n;
void treedp(int x,int fa)
}if(maxx+minn<=3)f[x]=minn+1;//兩個都能到,那麼優先選擇最小的
else f[x]=maxx+1;
if(maxx==-999999999)f[x]=3;//葉子
if(f[x]==5)
if(f[x]>=3 && fa==-1)ans++;
}int main()
ans=0;
treedp(1,-1);
printf("%d\n",ans);
return
0;}
消防局的設立
我先想的是貪心,但是沒有任何依據 所以rang了 然後想到了乙個有依據的貪心 我們可以找深度最深的乙個點開始考慮。可以證明,取此節點的爺爺一定是最優的。取自己 可以覆蓋自己,自己兄弟,父親,爺爺。取兄弟 可以覆蓋自己,自己兄弟,父親,爺爺。取父親 可以覆蓋自己,自己兄弟,父親,爺爺,父親的兄弟。取爺...
消防局的設立
p2279 hnoi2003 消防局的設立 主要思路 貪心,從葉子節點開始 按深度排序即可做到 從它父親的父親,把距離不超過 2 的節點都打上標記,ans 這樣一定最優,因為必須覆蓋那個沒被覆蓋的節點,而從祖父開始可以覆蓋更多的點。注意把根節點的父親設為根節點,否則從根節點開始跳就re了 inclu...
消防局的設立
2020 年,人類在火星上建立了乙個龐大的基地群,總共有 n 個基地。起初為了節約材料,人類只修建了 n 1 條長為 1 的道路來連線這些基地,並且每兩個基地都能夠通過道路到達,所以所有的基地形成了乙個巨大的樹狀結構。由於火星上非常乾燥,經常引發火災,人類決定在火星上修建若干個消防局。消防局只能修建...