題解 將軍令

2022-02-19 19:49:11 字數 1993 閱讀 2316

*這道題我看到有人打了樹形 dp *

我當時想,每種情況都要討論,20+的dp方程,那位神仙是給某主播打賞了10萬後氣急敗壞了嗎?

有的時候,可以貪心的別莽著打dp啊

有道簡化版:p2279 [hnoi2003]消防局的設立(樹形dp or 貪心)

luogu傳送門:p3942 將軍令

又想起了四月。

如果不是省選,大家大概不會這麼輕易地分道揚鑣吧? 只見乙個又乙個昔日的隊友離開了機房。

憑君莫話封侯事,一將功成萬骨枯。

夢裡,小 f 成了乙個給將軍送密信的信使。

現在,有兩封關乎國家生死的密信需要送到前線大將軍帳下,路途凶險,時間緊迫。小 f 不因為自己的禍福而避趨之,勇敢地承擔了這個任務。

不過,小 f 實在是太粗心了,他一不小心把兩封密信中的一封給弄掉了。

小 f 偷偷開啟了剩下的那封密信。他 發現一副十分詳細的地圖,以及幾句批文——原來 這是戰場周圍的情報地圖。他仔細看後發現,在這張地圖上標記了 n 個從 1 到 n 標號的 驛站,n − 1 條長度為 1 裡的小道,每條小道雙向連線兩個不同的驛站,並且驛站之間可以 通過小道兩兩可達。

小 f 仔細辨認著上面的批註,突然明白了丟失的信的內容了。原來,每個驛站都可以駐 扎乙個小隊,每個小隊可以控制距離不超過 k 裡的驛站。如果有驛站沒被控制,就容易產 生危險——因此這種情況應該完全避免。而那封丟失的密信裡,就裝著朝廷數學重臣留下的 精妙的排布方案,也就是用了最少的小隊來控制所有驛站。

小 f 知道,如果能計算出最優方案的話,也許他就能夠將功贖過,免於死罪。他找到了 你,你能幫幫他嗎? 當然,小 f 在等待你的支援的過程中,也許已經從圖上觀察出了一些可能會比較有用的 性質,他會通過一種特殊的方式告訴你。

一些分析

1.結構是一棵樹,就意味著不會出現環,這裡滿足無後效性。

2.dp是不大可能的,我們不可能浪費時間寫出巨量的dp轉移方程。

3.答案具有一定程度上的單調(圖大致不變,不斷增多點數,答案增加)

4.每乙個點都必須處理(這可以是一句廢話)

二次分析

1.如果我們把節點按照一定的順序處理,從而使我們安排守衛的收益(覆蓋的點更多),那麼一定會有一種更優的情況。

2。如果對一棵樹自頂向下處理,在優先考慮了頂部後,我們可能在根節點浪費更多的守衛。(因為每個守衛的控制距離一定,這樣等效於降低了守衛的價值)。

解法

我們將所有根節點按照深度排序,優先處理深度較大的節點,如果這個點沒有被守衛,則在它向上距離最遠的地方布置守衛,同時更新標記。

掃瞄點,處理深度的時候用bfs是o(n)的,ssw02懶得寫,就寫了o(nlogn)的dfs+優先佇列。

然後對每個安排守衛的節點進行染色dfs(不然會被菊花圖卡掉2個點)

ac code

#includeusing namespace std ;

const int maxn = 1e5+5 ;

inline int read()

int dep[ maxn ] , head[ maxn*2 ] , to[ maxn*2 ] , nex[ maxn*2 ] , tot = 1 ;

int n , m , k , fa[ maxn ] , ans = 0 ;

int vis[ maxn ] ;

priority_queue< pair>q ;

void add( int x , int y )

void dfs( int u , int father )

}void dfs2( int u , int dis , int kind )

}int main()

dfs( 1 , 0 ) ;

while( !q.empty() )

} cout《樹上的點覆蓋問題大多都和將軍令這道題比較相似,如果題意符合,就可以考慮從根節點向上的貪心策略。

將軍令題解

首先,每個葉子節點都要被至少乙個小隊控制,則貪心地放置小隊,放置之後沒被覆蓋的點跟屬於控制範圍的點無關,又屬於新的 葉子 繼續遞迴。如何貪心地放置?對於每乙個點,我們求出離它最遠的沒被覆蓋的點,若距離超過k 它離最近的小隊的距離,則必定放置小隊,並把離它距離小於等於k的父親標記,值為離它距離。inc...

Luogu P3942 將軍令 題解報告

題目傳送門 題目大意 這個題面有點中二啊hhhh 總結一下就是給出了一棵 n 個節點的樹,然後在乙個節點駐紮小隊就可以控制樹上所有距離它不超過 k 的節點,求最少需要駐紮多少個小隊就可以控制整棵樹。思路分析 首先有乙個非常顯然的結論,如果把小隊駐紮在葉子節點顯然是比駐紮在非葉子節點要不優的,所以我們...

題解 Luogu P3942 將軍令 貪心

f x 0 表示最近控制驛站的距離 f x 1 表示最遠不能控制的驛站距離 當f x 0 f x 1 k是說明能被控制,但沒有貢獻 當f x 1 k時,x必須被控制,這時已經到達能控制點的最遠距離,如果再向上,x就無法被控制 正確性 如果x可以向上移動,並且仍然能控制x移動前能控制的點,就把x向上移...