天天和樹 tree

2021-08-08 21:53:33 字數 1337 閱讀 4357

傳送門

正解做法:答案是圖上到直徑最遠的點到直徑的距離。

先求出直徑,再由直徑上的點向兩邊擴充套件,找最遠的距離來更新答案。

證明:

首先要知道到部分鏈(即到不了兩頭的鏈),一定不會比整條鏈更優。

後續證明因為時間原因,不再贅述,可自行畫圖理解。

至於怎麼求樹的直徑,這個方法很簡單,分兩步:

<1> 任取乙個點a,從這點a搜尋出乙個距離節點a最遠的乙個點b;

<2> 從節點b進行搜尋,然後找到乙個距離b最遠的節點c;

#include

#include

#include

#include

#include

#define ll long long

#define m 100009

using

namespace

std;

int n,head[m],nxt[2*m],to[2*m],tot;

int pre[m],root,leaf,deep[m],max_dep,ans;

bool f[m];

void add(int x,int y)

void find_root(int x)

for(int i=head[k];i;i=nxt[i])}}

} void find_leaf(int x)

for(int i=head[k];i;i=nxt[i])}}

}void dfs(int x)

for(int i=head[k];i;i=nxt[i])}}

}int main()

//退化成鏈

for(int i=1;i<=n-1;i++)

find_root(1); //找根

max_dep=0;

for(int i=1;i<=n;i++) deep[i]=0;

find_leaf(root);//由根找葉,即找距根最遠的點

int x=leaf;f[leaf]=1;

while(x!=root)

//把直徑打上標記

for(int i=1;i<=n;i++) deep[i]=0;

for(int i=1;i<=n;i++)

}printf("%d",ans);

return

0;}

Tyvj P4868 天天和不可描述

題目描述傳送門 遞迴。先預處理每個括號的配對情況,用lef i 表示i位置的右括號的與它配對的左括號的位置,rig i 同理。然後遞迴處理,用k表示從右往左還是從左往右。遇到括號遞迴。include include include include include using namespace st...

Tree字典樹講解

就像樹根一樣,每個點就是節點,也像乙個網狀鍊錶。優點 對於字串可以減少無所謂的比較,效率很高。多說無益,上例題 ignatius最近遇到乙個難題,老師交給他很多單詞 只有小寫字母組成,不會有重複的單詞出現 現在老師要他統計出以某個字串為字首的單詞數量 單詞本身也是自己的字首 input 輸入資料的第...

JAVA遞迴生成tree樹

關於類別樹的多級是乙個剛接觸ajax和多級類別很頭痛的問題,針對那種商品種類繁多,級別層次多更是麻煩的問題,去年剛學asp.net,實驗室的同學曾經這樣做過,遞迴sql,現在看了驚心動魄 雖然實現了類別多級的問題這樣帶來的後果確實無窮無盡的.遞迴查詢,和雙迴圈巢狀的執行sql語句沒什麼區別了.這樣帶...