HDU 3899 簡單樹形DP

2022-04-14 15:12:42 字數 1369 閱讀 6731

題意:一棵樹,給出每個點的權值和每條邊的長度,

點j到點i的代價為點j的權值乘以連線i和j的邊的長度。求點x使得所有點到點x的代價最小,輸出

雖然還是不太懂樹形dp是什麼意思,先把**貼出來把。

這道題目的做法是:先進行一次dfs,以每個節點為根,求出它下面節點到它的數量和。

再進行一次dfs,以每個節點為根,求出它下面節點到它的花費總和。

source code:

#pragma comment(linker, "/stack:16777216") //

for c++ compiler

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

#define max(a,b) (((a) > (b)) ? (a) : (b))

#define min(a,b) (((a) < (b)) ? (a) : (b))

#define abs(x) (((x) > 0) ? (x) : (-(x)))

using

namespace

std;

const

int inf = 0x3f3f3f3f

;const

int maxn = 100001

;struct

edge

edge(

int a, int

b) : v(a), w(b){}

};vector

node[maxn];

intn,sum[maxn],a[maxn];

//a[maxn]表示每乙個節點的權值,sum[maxn]表示子樹的權值和

ll dist[maxn];

bool

vis[maxn];

void

init()

void

dfs(ll u,ll dis)

}void

dfs1(ll u)

}int

main()

dfs(

1,0);

memset(vis,

0,sizeof

(vis));

dfs1(1);

ll ans = dist[1

];

for(i = 2; i <= n; ++i)

cout

<< ans

}

return0;

}

HDU 1520 簡單樹形dp

題意 乙個大學要舉行職工party。為使party中每個人都玩的開心,直接上司和下屬關係的員工不能同時參加。每個人都有各自的歡樂值。問如何邀請使得總歡樂值最大。dp i 1 表示選擇i點 dp i 0 表示不選擇i點 include include include include using nam...

樹形DP簡單總結

樹的特徵 1.n個點 只有n 1條邊的無向圖 2.無向圖里 任意兩點有且只有一條路 3.乙個點只有乙個前驅 但可以有多個後繼 4.無向圖沒有環 樹形dp 由於樹有著天然的遞迴結構 父子結構 而且它作為一種特殊的圖 可以描述許多複雜的資訊 因此在樹就成了一種很適合dp的框架 問題 給你一棵樹 要求用最...

HDU 2196 樹形dp入門

鏈結 傳送門 題意 給你乙個n個節點的棵樹,然後給你和 第i臺電腦與第a臺電腦相連的花費 v 問你最長的線路是多長 求樹上任意節點所能達到的最遠點的距離 樹形dp 開個陣列 分別記錄這個點到子樹最遠節點的最長距離和次長距離和記錄到父節點上的最長距離這樣在樹上dp 1.求子樹最長和次長 dp u 0 ...