dfs 洛谷 P2279 消防局的設立

2022-09-18 01:09:12 字數 1203 閱讀 1676

題目描述

2023年,人類在火星上建立了乙個龐大的基地群,總共有n個基地。起初為了節約材料,人類只修建了n-1條道路來連線這些基地,並且每兩個基地都能夠通過道路到達,所以所有的基地形成了乙個巨大的樹狀結構。如果基地a到基地b至少要經過d條道路的話,我們稱基地a到基地b的距離為d。

由於火星上非常乾燥,經常引發火災,人類決定在火星上修建若干個消防局。消防局只能修建在基地裡,每個消防局有能力撲滅與它距離不超過2的基地的火災。

你的任務是計算至少要修建多少個消防局才能夠確保火星上所有的基地在發生火災時,消防隊有能力及時撲滅火災。

輸入輸出格式

輸入格式:

輸入檔名為input.txt。

輸入檔案的第一行為n (n<=1000),表示火星上基地的數目。接下來的n-1行每行有乙個正整數,其中檔案第i行的正整數為a[i],表示從編號為i的基地到編號為a[i]的基地之間有一條道路,為了更加簡潔的描述樹狀結構的基地群,有a[i]

其實這題o(n^2)就可以過了

我們考慮一下怎麼將問題轉為o(n^2)

我們可以考慮當前沒有被管到的最深點i,如果取他的爺爺,那麼可以管到更多的點

那麼我們每次就找到最深點i,在他爺爺處設立消防局

再思考那怎麼將建消防局後的點都打上標記

然後我們就可以用乙個dfs來實現

最後模一模dalao用樹狀dp的做法(雖然這題就是放在dp分塊裡的)

#include

#include

#include

using

namespace

std;

#define maxn 1000

struct edgee[1010];

int head[1010],father[1010],tot,deep[1010],n,a,ans;

bool vis[1010];

void insert(int from,int to)

void dfs(int dep,int d)

int main()

for(int i=1;i<=n;++i) deep[i]=deep[father[i]]+1;

memset(vis,true,sizeof(vis));

while(true)

printf("%d\n",ans);

return

0;}

洛谷P2279消防局的設立

傳送門啦 乙個很摸不清頭腦的樹形dp 狀態 dp i 0 選自己 dp i 1 選了至少乙個兒子 dp i 2 選了至少乙個孫子 覆蓋了自己的 dp i 3 兒子孫子全部覆蓋 dp i 4 孫子全部覆蓋 並沒有覆蓋自己 初始轉移方程 dp i 0 1 sum min dp j 0.4 要使選了根節點...

洛谷 P2279 HNOI2003 消防局的設立

題目描述 2020年,人類在火星上建立了乙個龐大的基地群,總共有n個基地。起初為了節約材料,人類只修建了n 1條道路來連線這些基地,並且每兩個基地都能夠通過道路到達,所以所有的基地形成了乙個巨大的樹狀結構。如果基地a到基地b至少要經過d條道路的話,我們稱基地a到基地b的距離為d。由於火星上非常乾燥,...

洛谷 P2279 HNOI2003 消防局的設立

題目描述 2020年,人類在火星上建立了乙個龐大的基地群,總共有n個基地。起初為了節約材料,人類只修建了n 1條道路來連線這些基地,並且每兩個基地都能夠通過道路到達,所以所有的基地形成了乙個巨大的樹狀結構。如果基地a到基地b至少要經過d條道路的話,我們稱基地a到基地b的距離為d。由於火星上非常乾燥,...