題目鏈結
這個題目找最長的鏈其實就是找樹的直徑,不過需要注意的是一般求樹的直徑,長度一般都是邊的權值相加,但這裡是點的權值相加。接著就開始求最長鏈了。
如何求最長鏈?首先我們要建立乙個無向圖,把所有的點和邊連線起來,然後開始嘗試經過每乙個點的最長鏈,從而找到最長的鏈。求經過某個點的最長鏈時,我們可以先求出從這個點出發可以到達的最遠距離,然後再找出從這個點出發的第二遠的距離,最後將兩者相加即可得到經過該點的最長鏈。
然後不斷更新最長鏈即可得到答案。
在求經過某點到達的最遠距離時,是基於乙個動態規劃的思想
d[x]為從x出發可到達的最遠距離。
最後即可得到結果
實現**
#include
#include
#include
using
namespace std;
const
int maxn=
1e5+10;
const
int inf=
1e9+10;
typedef
long
long ll;
ll n,ans;
ll a[maxn]
,dp[maxn]
;vector<
int> e[maxn]
;void
dfs(
int u,
int be)
else
if(dp[v]
+a[u]
>tmp2)
} dp[u]
=tmp1;
ans=
max(ans,tmp1+tmp2-a[u]);
}int
main()
for(
int i=
0;i1;i++
) ans=
-inf;
dfs(1,
-1);
cout<
return0;
}
小白月賽22 B 樹上子鏈
考察點 樹的直徑 坑點 long long,是點權不是邊權 乙個點也算一條鏈 關於樹的直徑 這道題考察的是樹的直徑,最好用樹形dp來寫,具體解釋詳見上述部落格,這道題不友好的地方是把原先的邊權搞成了點權,這就讓人十分的頭疼,一頭疼這道題就涼涼,哈哈,可能還是對這個知識點掌握的不夠到位吧 includ...
牛客練習賽22 B 送分題
資料結構之神ccz又在出毒瘤資料結構了 神出了這樣乙個題 給你三個數,在這三個數中間任意加 或者是 然後可以隨便打括號,只要這個表示式合法 比如說1 2 3可以得到 不能改變這三個數的原順序 最大化表示式的值 輸入三行,每行乙個數 分別表示a,b,c輸出一行乙個數表示答案示例1 複製 1 23 複製...
牛客小白月賽22
d題 題目鏈結 解題思路 直接暴搜,因為只有10個卡片嘛10 所以最多計算 10 10!次,直接列舉全排列算就可以了 include include using namespace std const int inf 0x3f3f3f3f int x 22 y 22 c 22 int main do...