Acwing 1077 皇宮看守

2021-10-03 02:32:35 字數 1943 閱讀 1537

題目描述:

太平王世子事件後,陸小鳳成了皇上特聘的御前一品侍衛。

皇宮各個宮殿的分布,呈一棵樹的形狀,宮殿可視為樹中結點,兩個宮殿之間如果存在道路直接相連,則該道路視為樹中的一條邊。

已知,在乙個宮殿鎮守的守衛不僅能夠觀察到本宮殿的狀況,還能觀察到與該宮殿直接存在道路相連的其他宮殿的狀況。

大內保衛森嚴,三步一崗,五步一哨,每個宮殿都要有人全天候看守,在不同的宮殿安排看守所需的費用不同。

可是陸小鳳手上的經費不足,無論如何也沒法在每個宮殿都安置留守侍衛。

幫助陸小鳳布置侍衛,在看守全部宮殿的前提下,使得花費的經費最少。

輸入格式

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

第一行 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。

分析:本題乙個節點可以觀察到其父節點和孩子節點,求看守所有的宮殿需要的最小花費。如果還是像之前的問題那樣考慮兩種狀態,即乙個節點放置守衛和不放置守衛。放置守衛時,其孩子節點可以放置也可以不放置;但是不放置守衛時,其孩子節點的情況就不那麼明朗了,因為還需要考慮該節點的父節點有沒有放置守衛,放置了就可以觀察到該節點,其孩子節點放不放就無所謂了,但是萬一父節點也沒有放置守衛,孩子節點就至少有乙個要放置守衛了。所以只設定兩種狀態並不合適,乙個節點要麼放置守衛,要麼不放置,不放置又可以細分為兩種情況,父節點放置了守衛和孩子節點放置了守衛。所以一共有三種狀態,f[u][0]表示u的父節點放置了守衛但是u未放置守衛,f[u][1]表示u的孩子節點放置了節點但是u未放置守衛,f[u][2]表示u節點放置了守衛。u的父節點放置了守衛,故u的孩子節點可以放置可以不放置,f[u][0] += min(f[j][1][,f[j][2]),因為u沒有放置節點,而f[j][0]表示j的父節點放置了守衛,所以是不合法的狀態。如果u放置了守衛,則f[u][2] += min(f[j][0],f[j][1],f[j][2])。比較麻煩的是f[u][1],當u沒有放置守衛,需要找u的乙個孩子放置守衛,其它孩子可以放置可以不放置。設sum是u的所有孩子節點放置或者不放置守衛各種情況的最小花費,即sum += min(f[j][1],f[j][2]),可以發現sum與f[u][0]是相等的,所以不必單獨設定sum來儲存u的孩子節點的最小花費和,設u的某個孩子k放置了守衛,則f[u][1] = min(f[u][1],sum - min(f[k][1],f[k][2]) + f[k][2])。具體實現見**:

#include #include #include using namespace std;

const int n = 1505;

int f[n][3],h[n],e[n],w[n],ne[n],idx;

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()

}for(int i = 1;i <= n;i++)

}return 0;

}

AcWing 1077 皇宮看守

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

ACWing 1077 皇宮看守

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

AcWing 1077 皇宮看守

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