Problem:
Diameter of a Tree

Given a tree T with non-negative weight, find the diameter of the tree.

The diameter of a tree is the maximum distance between two nodes in a tree.

Input

n
s1 t1 w1
s2 t2 w2
:
sn-1 tn-1 wn-1

The first line consists of an integer n which represents the number of nodes in the tree. Every node has a unique ID from 0 to n-1 respectively.

In the following n-1 lines, edges of the tree are given.

si and ti represent end-points of the i-th edge (undirected) and wi represents the weight (distance) of the i-th edge.

Output

Print the diameter of the tree in a line.

Constraints

1 ≤ n ≤ 100,000

0 ≤ wi ≤ 1,000

Sample Input 1

4
0 1 2
1 2 1
1 3 3

Sample Output 1

5

Sample Input 2

4
0 1 1
1 2 2
2 3 4

Sample Output 2

7

Solution in C++ (judge verdict: Accepted)

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#include <functional>

using namespace std;
typedef pair<int, int> P;
static const int INF = 1e9;
static const int SIZE = 100001;

struct edge
{
	int to, cost;
};

vector<edge> G[SIZE];
int d[SIZE];
int n;

void bfs(int v)
{
	for (int i = 0; i < n; ++i)
	{
		d[i] = INF;
	}
	d[v] = 0;
	priority_queue < P, vector<P>, greater<P> > pque;
	pque.push(P(0, v));
	while (!pque.empty())
	{
		P p = pque.top();
		pque.pop();
		int vertex = p.second;
		for (int i = 0; i < G[vertex].size(); ++i)
		{
			edge e = G[vertex][i];
			if (d[e.to] > d[vertex] + e.cost)
			{
				d[e.to] = d[vertex] + e.cost;
				pque.push(P(d[e.to], e.to));
			}
		}
	}
}

void solve()
{
	cin >> n;
	for (int i = 0; i < n - 1; ++i)
	{
		int s, t, w;
		cin >> s >> t >> w;
		edge e1, e2;
		e1.to = t;
		e2.to = s;
		e1.cost = e2.cost = w;
		G[s].push_back(e1);
		G[t].push_back(e2);
	}
	bfs(0);
	int maxDist = 0;
	int maxv = 0;
	for (int i = 1; i < n; ++i)
	{
		if (maxDist < d[i])
		{
			maxDist = d[i];
			maxv = i;
		}
	}
	bfs(maxv);
	maxDist = 0;
	for (int i = 0; i < n; ++i)
	{
		if (maxDist < d[i])
		{
			maxDist = d[i];
		}
	}
	cout << maxDist << endl;
}

int main()
{
	solve();
	return(0);
}