题意是给定一棵树,求以每个点为起点所能得到的最长路。。。校赛的时候moonlight出了一个不固定起始点的树上最长路,当时没想法,赛后A了,没想到今天这个还是卡了很久。。。
求树上不固定起始点的最长路,两次dfs即可,第一次求到的最长路的终点必在最长路上,第二次dfs以其作为起始点就行。。。而这个题,求所有点为起点的最长路,任然需要两次dfs求出最长路及其两个端点,然后再来一次dfs,更新每个节点的最大距离就行。最近开始用宏定义了,感觉宏这个东西,看着挺恶心的,但是效果呢,谁用谁知道!
#include<iostream> #include<algorithm> #include<vector> #include<cstdio> #include<cstring> using namespace std; #define FF(i, a, b) for(int i=a; i<=b; i++) #define FD(i, a, b) for(int i=a; i<=b; i--) #define clr(a, b) memset(a, b, sizeof(a)) const int maxn = 10010; int ans[maxn], n, end, max_len; struct Edge { int to, dist; }; vector<Edge> edges; vector<int> G[maxn]; void add(int from, int to, int dist) { Edge x; x.to = to, x.dist = dist; edges.push_back(x); x.to = from; edges.push_back(x); int k = edges.size(); G[from].push_back(k-2); G[to].push_back(k-1); } inline void init() { clr(ans, 0); max_len = 0; edges.clear(); FF(i, 0, n) G[i].clear(); } void dfs(int u, int fa, int len) { int nc = G[u].size(); if(len > max_len) max_len = len, end = u; FF(i, 0, nc-1) { int v = edges[G[u][i]].to, w = edges[G[u][i]].dist; if(v != fa) { dfs(v, u, len + w); ans[v] = max(ans[v], len + w); } } } int main() { while(~scanf("%d", &n)) { init(); int a, b; FF(i, 2, n) { scanf("%d%d", &a, &b); add(i, a, b); } dfs(1, -1, 0); dfs(end, -1, 0); dfs(end, -1, 0); FF(i, 1, n) printf("%d\n", ans[i]); } return 0; }