hdu 2196 Computer(树上最长路)

来源:互联网 发布:编程用什么轴键盘 编辑:程序博客网 时间:2024/05/29 15:11

题意是给定一棵树,求以每个点为起点所能得到的最长路。。。校赛的时候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;}