我先想的是貪心,但是沒有任何依據(所以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 的道路來連線這些基地,並且每兩個基地都能夠通過道路到達,所以所有的基地形成了乙個巨大的樹狀結構。由於火星上非常乾燥,經常引發火災,人類決定在火星上修建若干個消防局。消防局只能修建...