这道题主要利用了树的直径和一条结论:距某个点最远的叶子节点一定是树的某一条直径的端点。
所以据某大佬说,跑三遍dfs就行了emmmmm..但是我到现在还是有点懵。。
另外很迷的一点是这份代码在gym上过了,但是在uva上WA了。。一模一样的代码啊...真是个玄学问题。。放在这里如果有大佬知道wa在什么地方了,还请不吝赐教(*^-^*)
代码如下:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<queue>
#include<string>
#include<sstream>
#include<fstream>
#include<utility>
using namespace std;
#define ll long long
typedef pair<int,int>pp;
#define mkp make_pair
#define pb push_back
const double pi=acos(-1.0);
const double eps=1e-9;
const int INF=0x3f3f3f3f;
const ll MOD=1e9+7ll;
const int MAX=50005;
int n;
int st,dis;
int ans[MAX],tmp[MAX];
bool vis[MAX];
vector<pp>vt[MAX];
void dfs(int u,int dist)
{
tmp[u]=dist;
if(dist>dis)
{
dis=dist;
st=u;
}
for(int i=0;i<vt[u].size();i++)
{
int v=vt[u][i].first;
if(!vis[v])
{
vis[v]=true;
dfs(v,vt[u][i].second+dist);
}
}
}
int main()
{
//freopen("I.IN","r",stdin);
while(scanf("%d",&n)==1)
{
int u,v,w;
for(int i=0;i<n-1;i++)
{
scanf("%d%d%d",&u,&v,&w);
u--,v--;
vt[u].pb(mkp(v,w));
vt[v].pb(mkp(u,w));
}
memset(ans,0,sizeof(ans));
st=0,dis=0;
memset(vis,false,sizeof(vis));
vis[st]=true;
dfs(st,0);
for(int i=0;i<n;i++)
ans[i]=max(ans[i],tmp[i]);
dis=0;
memset(vis,false,sizeof(vis));
vis[st]=true;
dfs(st,0);
for(int i=0;i<n;i++)
ans[i]=max(ans[i],tmp[i]);
dis=0;
memset(vis,false,sizeof(vis));
vis[st]=true;
dfs(st,0);
for(int i=0;i<n;i++)
{
printf("%d\n",max(ans[i],tmp[i]));
}
}
return 0;
}