維修道路 repair

2022-04-01 05:40:18 字數 1704 閱讀 3380

時間限制: 1 sec  記憶體限制: 128 mb

由於在十多年前道路改建時的突出貢獻, bob 被任命為維修道路的承包商, 他可以任意

選擇兩條路徑去修理。

bob 剛剛獲悉,這 n 個村莊相互連通,而且總共只有 n-1 條邊。

眾所周知, bob 修理這兩條道路得到的獲益是兩條路徑的長度的積, 所以當然他想最大

化他的獲益。

但是, bob 又不希望別人在背後說他壞話, 所以他希望這兩條路徑滿足以下兩個條件:

1. 這兩條路徑都是某兩個村莊之間的最短路徑。 (某兩個村莊就是路徑的起點和終點)

2. 這兩條路徑不會經過同乙個村莊。

第一行輸入 n。 表示村莊個數。

接下來 n-1 行,每行兩個數,表示這兩個村莊之間有一條無向邊。

輸出獲益的最大值。

4
1 2
2 3
3 4
7
1 2
1 3
1 4
1 5
1 6
1 7
6
1 2
2 3
2 4
5 4
6 4

1
0
4
1.選擇(1->2)和(3->4) ans=1*1

2.不管怎麼選擇這兩條路徑,一定會經過 1

3.選擇(1->3)和(5->6) ans=2*2=4 

emmmm

其實不難

題意:在一棵樹上找到兩條不相交的路徑(不能有點重合), 並且是兩點之間的最短路徑

使這兩個路徑長度的乘積最大

可以發現,這兩條在樹上了路徑,肯定是兩個不同的部分中(因為他在樹上qwq)

那我們就列舉斷掉樹的一條邊,然後再分別求這兩個樹的直徑就是最優的答案了。

這個是o(n^2)的

有兩個點t掉了

怎麼辦呢

這個簡單,直接打表優化awa

我們直接分類討論,討論直徑是否斷開,如果不斷開,那麼結果是直徑長度與掛在直徑下面的子樹的直徑乘積。

設直徑的左右端點為a和b,斷開直徑的一條邊,那麼結果就是左邊某個點到a的長度和右邊某個點到b的長度,可以通過維護字首的和字尾,分別維護左邊到達a和右邊到達b的最長路。

直接引用題解

qwq這個**沒寫awa

o(n^2)的有qwq

奉上

#include#define ll long long

using

namespace

std;

int n,tot=1,flag1,flag2,head[1000001

];int

sum,ret,ans,id;

struct

edge

e[1000001

];inline ll read()

inline

void add(int i,intj)

void dfs(int x,int fa,int dis,int

opt)

}int

main()

for(int i=2;i<=tot;i+=2

)

cout

return0;

}

poj3177重修道路 邊雙連通分量縮點

題目 找橋,縮點,總之都是板子 對於每個葉子,互相連一條邊即可 若最後剩下乙個,則去和根節點連邊 所以葉子節點數 1再 2即答案。如下 include include include using namespace std int n,m,ct 1,head 5005 reg 5005 c 5005...