ACWing 1077 皇宮看守

2021-10-22 03:14:22 字數 2928 閱讀 8373

太平王世子事件後,陸小鳳成了皇上特聘的御前一品侍衛。皇宮各個宮殿的分布,呈一棵樹的形狀,宮殿可視為樹中結點,兩個宮殿之間如果存在道路直接相連,則該道路視為樹中的一條邊。已知,在乙個宮殿鎮守的守衛不僅能夠觀察到本宮殿的狀況,還能觀察到與該宮殿直接存在道路相連的其他宮殿的狀況。大內保衛森嚴,三步一崗,五步一哨,每個宮殿都要有人全天候看守,在不同的宮殿安排看守所需的費用不同。可是陸小鳳手上的經費不足,無論如何也沒法在每個宮殿都安置留守侍衛。幫助陸小鳳布置侍衛,在看守全部宮殿的前提下,使得花費的經費最少。

輸入格式:

輸入中資料描述一棵樹,描述如下:第一行n

nn,表示樹中結點的數目。第二行至第n+1

n+1n+

1行,每行描述每個宮殿結點資訊,依次為:該宮殿結點標號i

ii,在該宮殿安置侍衛所需的經費k

kk,該結點的子結點數m

mm,接下來m

mm個數,分別是這個結點的m

mm個子結點的標號r1,

r2,…

,r

mr_1,r_2,…,r_m

r1​,r2

​,…,

rm​。對於乙個n

nn個結點的樹,結點標號在1

11到n

nn之間,且標號不重複。

輸出格式:

輸出乙個整數,表示最少的經費。

資料範圍:

1 ≤n

≤1500

1≤n≤1500

1≤n≤15

00思路是動態規劃。設f[i

][0,

1,2]

f[i][0,1,2]

f[i][0

,1,2

]是只考慮以i

ii為樹根的子樹的情況下,要看守該子樹所有節點的最小代價。設i

ii的各個兒子分別是x1,

...,

xm

x_1,...,x_m

x1​,..

.,xm

​,其中:

1、f [i

][0]

f[i][0]

f[i][0

]表示i

ii自己沒有侍衛,而是被其父親節點的侍衛看守的情況;

2、f [i

][1]

f[i][1]

f[i][1

]表示i

ii自己沒有侍衛,而是被其某個子節點的侍衛看守的情況;

3、f [i

][2]

f[i][2]

f[i][2

]表示i

ii自己就有個侍衛的情況。

在情況1

11裡,此時其所有兒子節點要麼自己就有侍衛,要麼被其子節點看守(其父親沒有侍衛,所以不能被父節點看守),所以有:f[i

][0]

=∑1≤

j≤

mmin

⁡f[i][0]=\sum_ \min \

f[i][0

]=1≤

j≤m∑

​min

在情況3

33裡,此時其所有兒子可以自己有侍衛,也可以被其父親看守,也可以被其自己的兒子看守,所以有:f[i

][2]

=ci+

∑1≤j

≤m

min⁡

f[i][2]=c_i+\sum_\min\

f[i][2

]=ci

​+1≤

j≤m∑

​min

其中c

ic_i

ci​是看守節點i

ii需要的代價。在情況2

22裡,節點i

ii必須得有乙個孩子是有侍衛的(即某個節點的代價取f[x

k][2

]f[x_k][2]

f[xk​]

[2]),別的節點可以有侍衛,或者被其子節點看守(這些節點的代價取min

⁡\min\

min),所以有:f[i

][1]

=min⁡k

}=

min⁡k}

f[i][1]=\min_k\ \min \\}\\=\min_k\\}

f[i][1

]=kmin​}

=kmin​

}在**裡,可以先遞迴求解其所有孩子節點的f

ff值,再按上面的式子求解f[i

]f[i]

f[i]

。最後要返回的是min

⁡\min\

min(r

rr為樹根,由於樹根沒有父親,所以取不到f[r

][0]

f[r][0]

f[r][0

])。**如下:

#include

#include

using

namespace std;

const

int n =

1510

;int n;

int h[n]

, e[n]

, ne[n]

, w[n]

, idx;

int f[n][3

];// 求樹根之用

bool st[n]

;void

add(

int a,

int b)

void

dfs(

int u)

f[u][1

]=0x3f3f3f3f

;for

(int i = h[u]

;~i; i = ne[i])}

intmain()

}// 只從樹根開始dfs

for(

int i =

1; i <= n; i++)if

(!st[i]

)return0;

}

時空複雜度o(n

)o(n)

o(n)

Acwing 1077 皇宮看守

題目描述 太平王世子事件後,陸小鳳成了皇上特聘的御前一品侍衛。皇宮各個宮殿的分布,呈一棵樹的形狀,宮殿可視為樹中結點,兩個宮殿之間如果存在道路直接相連,則該道路視為樹中的一條邊。已知,在乙個宮殿鎮守的守衛不僅能夠觀察到本宮殿的狀況,還能觀察到與該宮殿直接存在道路相連的其他宮殿的狀況。大內保衛森嚴,三...

AcWing 1077 皇宮看守

和acwing 323.戰略遊戲這題非常類似,但又有些不同 acwing 323.戰略遊戲在一條道路的兩個結點至少有乙個是放的,而這題不一定,比如 1 2 3 4 5 6我們可以在3,4,5,6號點放,其他各點都不放。這樣邊1 2的兩個端點都沒有守衛,這就和acwing 323.戰略遊戲這題不同了 ...

AcWing 1077 皇宮看守

原題鏈結 考察 樹形dp 這道題戰略遊戲要求看到所有的邊,本題要求看到所有的點 沒想出來,參考了大佬的思路 照搬大佬的思路 設樹上某點u能被看見,這個點要麼自己安插士兵,要麼父節點安插士兵,要麼子節點安插士兵.設f u,st 表示u的st狀態的最小花費.st 0時,它u被父節點看見,st 1,u被子...