hdu2196樹形dp 鄰接表

2021-07-10 01:54:17 字數 977 閱讀 2832

題目大意:找離每個節點的最遠距離

思路:dp[i][0]表示子樹的最遠距離,dp[i][1] 表示子樹以外的最遠距離,dp[i][2] 表示字數第二遠距離

第一遍dfs求出dp[i][0]和dp[i][2];第二遍求出dp[i][1],注意第一遍結束後初始化dp[1][1].其他的看**

#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

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

#define maxn 10005

#define mod 1000000007

#define mem(a , b) memset(a , b , sizeof(a))

#define ll long long

#define inf 100000000

int n;

struct edge

e[maxn];

int head[maxn];

int dp[maxn][3];

int dfs(int root)

else if(tmp > dp[root][2]) dp[root][2] = tmp;

}return dp[root][0];

}int dfs2(int root)

}int main()

dfs(1);

dp[1][1] = dp[1][2];

dfs2(1);

for(int i = 1 ; i <= n ; i ++) printf("%d\n" , max(dp[i][0] , dp[i][1]));

}return 0;

}

HDU 2196 樹形dp入門

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

題解 hdu2196 樹形DP

題目鏈結 分析 求乙個樹中所有節點能到達的最遠距離f i 要用兩個dfs。首先第乙個dfs求出所有每個節點i在其子樹中的正向最大距離和正向次大距離和dist i 0 和dist i 1 如果i節點在子樹中最大距離經過了2號兒子,那麼次大距離就是不經過2號兒子的最大距離 並且還要標記longest i...

HDU 2196 經典樹形DP

大體思路是將乙個無根數轉化為有根樹,再深搜兩次,第一次將每個子樹的根距其葉子的最遠距離求出來 自下而上 第二次求每個節點到其他結點的最遠距離 自上而下 但因為在第二次深蒐時可能會碰到乙個結點的父節點的最遠距離經過它,所以我們需要儲存乙個最長距離和乙個次長距離 include include incl...