標籤:
解題思路:
求出樹的直徑的兩個端點,則樹上每個節點到其他點的最遠距離一定是到這兩個端點的距離中最長的那一個。
#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>#include <cmath>#include <vector>#include <queue>#define LL long longusing namespace std;const int MAXN = 100000 + 10;struct Edge{ int to, next, w;}edge[2 * MAXN];int tot;int head[MAXN];int dis[MAXN];int N, M;int D[MAXN];void init(){ tot = 0; memset(head, -1, sizeof(head)); memset(D, 0, sizeof(D));}void addedge(int u, int v, int w){ edge[tot].to = v; edge[tot].next = head[u]; edge[tot].w = w; head[u] = tot++;}int dfs(int u, int pre = -1){ int ans = u; for(int i=head[u];i!=-1;i=edge[i].next) { int v = edge[i].to; if(v == pre) continue; dis[v] = dis[u] + edge[i].w; int dv = dfs(v, u); if(dis[ans] < dis[dv]) ans = dv; } return ans;}int solve(int u){ dis[u] = 0; u = dfs(u); dis[u] = 0; int v = dfs(u); for(int i=1;i<=N;i++) D[i] = max(D[i], dis[i]); dis[v] = 0; dfs(v); for(int i=1;i<=N;i++) D[i] = max(D[i], dis[i]); for(int i=1;i<=N;i++) cout << D[i] << endl;}int main(){ while(scanf("%d", &N)!=EOF) { int v, w; init(); for(int i=2;i<=N;i++) { scanf("%d%d", &v, &w); addedge(i, v, w); addedge(v, i, w); } solve(1); } return 0;}
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
HDU 2196 Computer(求樹上每個節點到其它點的最遠距離)