題目描述
太平王世子事件後,陸小鳳成了皇上特聘的御前一品侍衛。皇宮各個宮殿的分布,呈一棵樹的形狀,宮殿可視為樹中結點,兩個宮殿之間如果存在道路直接相連,則該道路視為樹中的一條邊。已知,在乙個宮殿鎮守的守衛不僅能夠觀察到本宮殿的狀況,還能觀察到與該宮殿直接存在道路相連的其他宮殿的狀況。大內保衛森嚴,三步一崗,五步一哨,每個宮殿都要有人全天候看守,在不同的宮殿安排看守所需的費用不同。可是陸小鳳手上的經費不足,無論如何也沒法在每個宮殿都安置留守侍衛。幫助陸小鳳布置侍衛,在看守全部宮殿的前提下,使得花費的經費最少。
輸入格式
輸入中資料描述一棵樹,描述如下:
第一行 n,表示樹中結點的數目。
第二行至第 n+1 行,每行描述每個宮殿結點資訊,依次為:該宮殿結點標號 i,在該宮殿安置侍衛所需的經費 k,該結點的子結點數 m,接下來 m 個數,分別是這個結點的 m 個子結點的標號 r1,r2,…,rm。
對於乙個 n 個結點的樹,結點標號在 1 到 n 之間,且標號不重複。
輸出格式
輸出乙個整數,表示最少的經費。
資料範圍
1≤n≤1500
輸入樣例
6
1 30 3 2 3 4
2 16 2 5 6
3 5 0
4 4 0
5 11 0
6 5 0
輸出樣例
25
樣例解釋
在2、3、4結點安排護衛,可以觀察到全部宮殿,所需經費最少,為 16 + 5 + 4 = 25。
解題思路
首先這道題的題意是:給定一棵樹,要在一些節點上放置守衛,每個守衛可以看護當前節點以及與此節點連通的節點,在不同節點放置守衛的代價不同,如何選取節點使代價最小,這是個典型的樹形dp問題,顯然每個節點有放置守衛和不放置守衛兩種,但是從計算的過程看,不放置守衛的狀態由兩種,一種是有其父節點上的守衛看護,一種是由其子節點的守衛看護,因此可將每個節點的看護情況分為三種:
該節點由父節點處放置的守衛看護
該節點由子節點處放置的守護看護
該節點由在該節點放置的守衛看護
下面考慮狀態轉移的過程,建立陣列f[i][3],其中
f[i][0]表示第i個節點由父節點處放置的守衛看護下的最小代價
f[i][1]表示第i個節點由子節點處放置的守衛看護下的最小代價
f[i][2]表示第i個節點由在該節點放置的守衛看護下的最小代價
那麼可以寫出轉移關係:
f[i][0] += min(f[j][1], f[j][2]);
f[i][1] = min(f[i][1], sum - min(f[j][1], f[j][2]) + f[j][2]);
f[i][2] += min(min(f[j][0], f[j][1]), f[j][2]);
其中j為i的子節點,sum為所有子節點j的min(f[j][1], f[j][2])的和,1和3的意義很明顯,2的意義代表,如果第i個節點由子節點守衛,那麼所有子節點都不能由父節點守衛,並且每個子節點都得到了守衛,且至少有乙個子節點處放置了守衛
至此,演算法思路就很清晰了,下面就用常規求解過程來寫**
**
#include #include #include #include using namespace std;
const int n = 1510;
int n;
int h[n], e[n], ne[n], idx,w[n];
int f[n][3];
bool st[n];
void add(int a, int b)
void dfs(int u)
f[u][1] = 1e9;
for (int i = h[u]; ~i; i = ne[i])
}int main()
}int root = 1;
while (st[root]) root ++ ;
dfs(root);
cout << min(f[root][1], f[root][2]) << endl;
return 0;
}
Acwing 1077 皇宮看守
題目描述 太平王世子事件後,陸小鳳成了皇上特聘的御前一品侍衛。皇宮各個宮殿的分布,呈一棵樹的形狀,宮殿可視為樹中結點,兩個宮殿之間如果存在道路直接相連,則該道路視為樹中的一條邊。已知,在乙個宮殿鎮守的守衛不僅能夠觀察到本宮殿的狀況,還能觀察到與該宮殿直接存在道路相連的其他宮殿的狀況。大內保衛森嚴,三...
AcWing 1077 皇宮看守
和acwing 323.戰略遊戲這題非常類似,但又有些不同 acwing 323.戰略遊戲在一條道路的兩個結點至少有乙個是放的,而這題不一定,比如 1 2 3 4 5 6我們可以在3,4,5,6號點放,其他各點都不放。這樣邊1 2的兩個端點都沒有守衛,這就和acwing 323.戰略遊戲這題不同了 ...
ACWing 1077 皇宮看守
太平王世子事件後,陸小鳳成了皇上特聘的御前一品侍衛。皇宮各個宮殿的分布,呈一棵樹的形狀,宮殿可視為樹中結點,兩個宮殿之間如果存在道路直接相連,則該道路視為樹中的一條邊。已知,在乙個宮殿鎮守的守衛不僅能夠觀察到本宮殿的狀況,還能觀察到與該宮殿直接存在道路相連的其他宮殿的狀況。大內保衛森嚴,三步一崗,五...