ZJNU 1361

树上两点最远距离

 #include <bits/stdc++.h>
    using namespace std;
    
    const int bsz=1<<18;
    char bf[bsz], *head, *tail;
    inline char gc(){
    
    
        if(head==tail){
    
     int l=fread(bf,1,bsz,stdin); tail=(head=bf)+l;}
        return *head++;
    }
    inline which read(){
    
    
        which x=0,f=1; char c=gc();
        for(;!isdigit(c);c=gc()){
    
     if(c=='-') f=-1;}
        for(;isdigit(c);c=gc()) x=x*10+c-'0';
        return x*f;
    }
    inline void write(which x){
    
     if(x>=10) write(x/10);  putchar(x%10+'0');}
    
    struct node{
    
     int id, val; node(int a,int b): id(a), val(b){
    
    }};
    
    vector<node> G[100010]; 
    bool vis[100010]; 
    int n, duan, sum, tmax, des;
    
    inline void dfs(int pre, int cur, int val){
    
    
    	vis[cur]=1;
    	if(pre^-1){
    
    
    		sum+=val; if(tmax<sum) tmax=sum, des=cur;	
    	}
    	for(int i=0;i<G[cur].size();++i){
    
    
    		node t=G[cur][i];
    		if(!vis[t.id]) dfs(cur,t.id,t.val);
    	}
    	vis[cur]=0, sum-=val;
    }
    
    int main(){
    
    
    	n=read();
    	for(int a, b, c, i=1;i<n;++i) a=read(), b=read(), c=read(), G[a].push_back(node(b,c)), G[b].push_back(node(a,c));
    	dfs(-1,1,0), dfs(-1,des,0); 
    	printf("%d\n",tmax);
    	
    	return 0;
    } 

猜你喜欢

转载自blog.csdn.net/qq_45757639/article/details/109357114