树的直径:一棵树的直径就是这棵树上存在的最长路径。
求法与结论:两次dfs。第一次任意选一个点进行dfs找到离它最远的点,此点就是最长路的一个端点,再以此点进行dfs,找到离它最远的点,此点就是最长路的另一个端点,于是就找到了树的直径。
/*
求树的直径
两次dfs 复杂度O(2*m)
先从任意一个点dfs,找到离这个点最远的点
从这个最远的点进行dfs,找到离这个点最远的点
*/
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
typedef long long ll;
struct node{
int num,val;
node(int a,int b)
{
num = a;
val = b;
}
};
int vis[10005];
vector<node> g[10005]; //建树
ll ans = 0,p = 1; //最大总权值和,找到的最远点
void dfs(int x,ll cost,int val)
{
cost += val; //加上权值
vis[x] = 1;
if( ans < cost ) //更新最大权值
{
ans = cost;
p = x;
}
for (int i = 0; i < g[x].size(); i++)
{
node t = g[x][i];
if( !vis[t.num] ) dfs(t.num,cost,t.val);
}
}
int main()
{
int x,y,v;
while( scanf("%d%d%d",&x,&y,&v) != EOF )
{
g[x].push_back(node(y,v));
g[y].push_back(node(x,v));
}
dfs(1,0,0);
ans = 0; //dfs一次完后将vis数组清0,ans清0
memset(vis,0,sizeof(vis));
dfs(p,0,0);
printf("%lld\n",ans);
return 0;
}