1. 程式人生 > >【C++】APIO2010 巡邏

【C++】APIO2010 巡邏

分析 php 題目 lan ans blank n-1 之間 【c++】

1.題目描述

Luogu-P3629

Bzoj-1912

2.分析

1.對於原圖,我們可以知道,若要回到節點1,每一條邊至少經過兩次(來一次,去一次),所以此時$ans=(n-1)*2$

2.不妨設$L_1$為第一條路徑長,$L_2$為第二條路徑長,當$k=1$時,從貪心的角度來考慮,肯定是要將距離最遠的兩個點連接在一起

3.若要找出距離最遠的兩個點,這兩個點肯定是樹的任意一條直徑中的兩個端點

4.當我們將這兩個點連接時,顯然會形成一個環,此時$ans=(n-1)*2-L_1+1$

5.故當$k=2$時,連接兩個點$(u,v)$之後,又會形成一個環

6.此時存在兩種情況:

  1°兩個環沒有重疊部分

  2°兩個環有重疊部分

7.對於情況1,樹上$(u,v)$之間原有的路徑只需經過一次,$ans$繼續減小

8.對於情況2,如果我們依然按照$k=1$的情況建立新的路徑,則兩個環重疊的部分就不會有巡邏車經過,不滿足原題要求。

9.所以我們不得不讓巡邏車必須經過這些邊。

10.最終,我們使得這些重疊的邊又經過了兩次,此時$ans=(n-1)*2-L_1+1-L_2+1$

【C++】APIO2010 巡邏