時間限制: 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
41.選擇(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 longusing
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...