【題目鏈結】:
【題意】
【題解】
有乙個經典的求樹的直徑的方法;
首先;
樹的直徑的兩端的端點必然都在樹的葉子上(或在根節點,考慮一條鏈的情況);
則 設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...