洛谷 P2279 HNOI2003 消防局的設立

2021-08-08 20:00:52 字數 1305 閱讀 5137

題目描述

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]

#include

#include

#include

#include

using

namespace

std;

#define maxn 5005

struct nodet[maxn];

struct edgee[maxn<<1];

int n,ans=0,head[maxn],fa[maxn],tot,dep[maxn];

bool vis[maxn];

inline

void add_edge(int u,int v)

inline

void read(int &x)

while(c>='0'&&c<='9') x*=f;

}void dfs(int u,int from)

}inline

bool cmp(node a,node b)

void push_down(int u,int f,int k)

}int main()

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

return0;}

int aptal_is_my_son=main();

int main(int argc,char *argv)

貪心的思路:

對於某個葉節點,能覆蓋到它的只有自己、父節點或者爺爺節點,肯定是在爺爺節點會更優,爺爺節點建立消防局之後對周圍距離小於等於2的點染一下色。

按照深度從大到小排序(先處理葉節點)

動態規劃雖然能做,但是還不如貪心好想、好些、跑得快

洛谷 P2279 HNOI2003 消防局的設立

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

洛谷P2279 HNOI2003 消防局的設立

題目鏈結 貪心 每次取出深度最大的節點,若沒有被覆蓋到,要想覆蓋它,最優的做法顯然是將它的爺爺設為消防局 因為該節點深度為最大,選兄弟 父親所覆蓋的節點,選了爺爺後都能夠覆蓋 用優先佇列維護深度即可 include include include include using namespace st...

P2279 HNOI2003 消防局的設立

p2279 hnoi2003 消防局的設立 寫得不錯 寫得也可以 樹形動規的寫法,沒人指導,確實看不懂,無奈,找能看懂得來研究。此文做法,摘抄如下 乙個簡單的貪心,我們只要考慮2個消防局設立的距離為5時是最好的,因為利用最充分.就dfs一遍,再對根處理一下就可以了.這道題應該是sgu某道題的簡化版....