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