hiho一下 第十一周 樹中的最長路

2021-09-28 09:54:52 字數 1309 閱讀 3722

【題目鏈結】:

【題意】

【題解】

有乙個經典的求樹的直徑的方法;

首先;

樹的直徑的兩端的端點必然都在樹的葉子上(或在根節點,考慮一條鏈的情況);

則 設f[i][0]表示離i這個點最遠的葉子節點的距離

f[i][1]表示離i這個點第二遠的葉子節點的距離

更新的話

f[x][0]=max(f[son][0]+1);

f[x][1] = max(second(f[son][0])+1);

則可以通過dp求出來所有的節點的f值,取max就是它的直徑了;

這裡我們可以降成一維的即

ans = max(ans,f[x]+f[son]+1),f[x]=max(f[son]+1);

這裡f[x]=max(f[son]+1)在ans更新完後才更新;

這個做法就等同於上面那個做法;

【number ofwa】

0 【完整**】

#include 

using

namespace

std;

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

#define ll long long

#define rep1(i,a,b) for (int i = a;i <= b;i++)

#define rep2(i,a,b) for (int i = a;i >= b;i--)

#define mp make_pair

#define pb push_back

#define fi first

#define se second

#define ms(x,y) memset(x,y,sizeof x)

typedef pair pii;

typedef pairpll;

const

int dx[9] = ;

const

int dy[9] = ;

const

double pi = acos(-1.0);

const

int n = 1e5+100;

int n,f[n],ans;

vector

g[n];

void dfs(int x,int fa)

}int main()

dfs(1,0);

cout

<< ans << endl;

return

0;}

hihocoder 第十一周 樹中的最長路

題意 找出二叉樹中相距最遠的兩個節點的距離。輸入每個測試點 輸入檔案 有且僅有一組測試資料。每組測試資料的第一行為乙個整數n,意義如前文所述。每組測試資料的第2 n行,每行分別描述一根木棍,其中第i 1行為兩個整數ai,bi,表示第i根木棍連線的兩個小球的編號。對於20 的資料,滿足n 10。對於5...

hiho一下 第一周

題目名稱 最長回文子串 小hi和小ho是一對好朋友,出生在資訊化社會的他們對程式設計產生了莫大的興趣,他們約定好互相幫助,在程式設計的學習道路上一同前進。這一天,他們遇到了一連串的字串,於是小hi 就向小ho 提出了那個經典的問題 小ho 你能不能分別在這些字串中找到它們每乙個的最長回文子串呢?小h...

hiho一下第一周 最長回文子串

類似於kmp的思想,利用已經匹配的資訊計算未匹配的資訊。基本原理就是 我們將f i 定義為以i為中心的最長回文串長度。那麼如果有f 5 7,f 4 3,那麼我們可以得到f 6 3.以此來減少比較次數。當然還有一些細節要處理。比如回文串長度的奇偶性。這個是我自己寫的版本,不是很精簡。include i...