消防局的設立

2021-09-28 21:25:08 字數 1336 閱讀 8867

我先想的是貪心,但是沒有任何依據(所以rang了 )

然後想到了乙個有依據的貪心…我們可以找深度最深的乙個點開始考慮。可以證明,取此節點的爺爺一定是最優的。

取自己 可以覆蓋自己,自己兄弟,父親,爺爺。

取兄弟 可以覆蓋自己,自己兄弟,父親,爺爺。

取父親 可以覆蓋自己,自己兄弟,父親,爺爺,父親的兄弟。

取爺爺 可以覆蓋自己,自己兄弟,父親,爺爺,父親的兄弟,爺爺的兄弟,爺爺的爺爺,爺爺的爸爸。

然後,就可以愉快地開碼了!

#include

#include

#include

#include

#include

using

namespace std;

const

int n =

1002

;struct node

node

(const

int dep,

const

int id)

}s[n]

;struct type

type

(const

int dian,

const

int step)};

vector <

int> g[n]

;int n, d[n]

, fa[n]

;bool vis[n]

;queue q;

bool

cmp(

const node a,

const node b)

void

init

(const

int x,

const

int ba)

}void

bfs(

const

int x)}}

intmain()

init(1

,0);

for(

int i =

1; i <= n; i ++

) s[i]

=node

(d[i]

, i)

;sort

(s +

1, s + n +

1, cmp)

;for

(int i =

1; i <= n; i ++

)printf

("%d\n"

, ans)

;return0;

}

然後,這題還有dp做法。(我就懶得碼了 )

上鏈結

然後,我想附註一下,g陣列j層不包含第j層。

消防局的設立

p2279 hnoi2003 消防局的設立 主要思路 貪心,從葉子節點開始 按深度排序即可做到 從它父親的父親,把距離不超過 2 的節點都打上標記,ans 這樣一定最優,因為必須覆蓋那個沒被覆蓋的節點,而從祖父開始可以覆蓋更多的點。注意把根節點的父親設為根節點,否則從根節點開始跳就re了 inclu...

消防局的設立

2020 年,人類在火星上建立了乙個龐大的基地群,總共有 n 個基地。起初為了節約材料,人類只修建了 n 1 條長為 1 的道路來連線這些基地,並且每兩個基地都能夠通過道路到達,所以所有的基地形成了乙個巨大的樹狀結構。由於火星上非常乾燥,經常引發火災,人類決定在火星上修建若干個消防局。消防局只能修建...

消防局的設立(樹形DP)

2020 年,人類在火星上建立了乙個龐大的基地群,總共有 n 個基地。起初為了節約材料,人類只修建了 n 1 條長為 1 的道路來連線這些基地,並且每兩個基地都能夠通過道路到達,所以所有的基地形成了乙個巨大的樹狀結構。由於火星上非常乾燥,經常引發火災,人類決定在火星上修建若干個消防局。消防局只能修建...