树的最长路径

思路:

在遍历时,随便以一个结点为根节点,后续遍历即可。因为是多叉树,在求其到其它结点的最大深度时,要用两个变量first和second,表示该结点到其它结点的最大深度和次大深度。在以某个结点为根节点的树中,最远两个结点的距离为first+second

代码实现:

#include 
using namespace std;
typedef long long int ll;
struct edge
{
    int to;
    int cost;
    edge(int x,int w):to(x),cost(w){}
};
vector g[23339];
inline void addedge(int x,int y,int w)
{
    g[x].push_back(edge(y,w));
    g[y].push_back(edge(x,w));
}
int n;
ll ma=-1;
int dfs(int pre,int cur,int w)
{
    ll ft,sd;
    ft=sd=0;
    for(int i=0;ift)
            {
                sd=ft;
                ft=tp;
            }
            else
              if(tp>sd)
                sd=tp;
        }
    ma=max(ma,ft+sd);
    return ft+w;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin>>n;
    int x,y,w;
    for(int i=1;i<=n-1;i++)
    {
        cin>>x>>y>>w;
        addedge(x,y,w);
    }
    dfs(0,1,0);
    ll s=ma*10+ma*(ma+1)/2;
    cout<

 

你可能感兴趣的:(图论)