題目描述
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]分析這道題,不難發現
我們每次可以選取乙個深度最深的點,之後把他爺爺放入消防站,暴力貪心~~(注意一下二次染色的計數操作emmm好久不打有點生)
上**
#include
#include
#include
#include
#include
using
namespace std;
int n,ans;
int fa[
10005];
int ffa;
int tot,head[
10005
],nex[
10005
],to[
10005];
bool vis[
10005];
int depth[
1005];
struct node d[
10005];
inline
intread()
while
(ch>=
'0'&&ch<=
'9')
return x*f;
}inline
void
add(
int x,
int y)
void
dfs(
int dian,
int father,
int dep)
}inline
bool
cmp(node a,node b)
inline
void
solve
(int x,
int ti)
}int
main()
fa[1]
=1;dfs(1
,0,1
);for(
int i=
1;i<=n;i++
) d[i]
.biao=i,d[i]
.depth=depth[i]
;sort
(d+1
,d+n+
1,cmp)
;for
(int j=
1;j<=n;j++)}
cout
}
洛谷 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某道題的簡化版....