題目傳送門
題目大意:給一棵邊帶權的樹,你可以將一條邊換個位置,換完之後還得是一棵樹,要求換完之後樹的直徑最小。
o (n
)o(n)
o(n)
做法太強了,只能想到 o(n
2)
o(n^2)
o(n2
) 的做法……
考慮列舉刪去哪一條邊,假如刪掉當前列舉的邊,那麼整棵樹會被分成兩個部分,然後我們要把這條邊重新找個位置,假如我們選擇了連線部分1
11中的 x
xx 和部分2
22中的 y
yy,那麼這棵樹的直徑就是:
max
\max\
max直徑很好求,最長鏈也是 dpdp
dp一下就可以了,要分兩次 dpdp
dp,第一次求出每個點往自己子樹內走的最長鏈,第二次利用上一次的 dpdp
dp出來的結果,求出每個點往父親方向走的最長鏈。
最後找到每個部分內 延申出去的最長鏈 最短 的點就是我們要鏈結的點了。
**如下:
#include
#include
using
namespace std;
#define maxn 5010
int n,ans=
2147483640
;struct edge
;edge e[maxn<<1]
;int first[maxn]
,len=0;
void
buildroad
(int x,
int y,
int z)
; first[x]
=len;
}struct par
void
operator+=
(const par &b)};
int f[maxn]
,from[maxn]
;void
dp1(
int x,
int fa)
}par dp2
(int x,
int fa,
int to_fa)
return p;
}int
main()
printf
("%d"
,ans)
;}
TJOI2017 城市(樹的直徑)
從加里敦大學城市規劃專業畢業的小明來到了乙個地區城市規劃局工作。這個地區一共有ri座城市,1條高速公路,保證了任意兩運城市之間都可以通過高速公路相互可達,但是通過一條高速公路需要收取一定的交通費用。小明對這個地區深入研究後,覺得這個地區的交通費用太貴。小明想徹底改造這個地區,但是由於上司給他的資源有...
TJOI2017 城市 樹形dp
這是個神仙題,會卡常 題目讓你改一條邊把直徑變得最短。列舉每條邊,會把圖分成兩個地方,兩個連通塊 x區和y區域 都換根dp一下,算出離x最遠的點的距離記為dis x 然後列舉一下 新直徑有三個 1 max dis x x裡面最大的 2 dis y y裡面最大的 3 min dis x dis y l...
TJOI2017 城市 樹的直徑,貪心
這道題,調了我一晚上.一直80分 考慮到幾點 所以我們先列舉斷開直徑上的邊,然後分別找到斷開後兩棵子樹的直徑.接著我們討論 dis 1,dis 2 最優情況.其 dis 為其到子樹直徑較遠的一端.如果 x 1,x 2 在子樹的直徑上,那麼顯然會更優,因為如果不在直徑上,它還會多出一小段距離.然後就可...