提交时间:2022-07-13 11:53:32

运行 ID: 51575

#include<bits/stdc++.h> using namespace std; const int maxn=1e5+10; const int inf=0x7fffffff; int n,m,head[maxn],tot; struct XYH{ int to,w,nxt; }edge[maxn<<1]; void Add(int u,int v,int w){ edge[++tot].to=v; edge[tot].w=w; edge[tot].nxt=head[u]; head[u]=tot; } int mx,mi,num,r,num2; bool flag; int pp[maxn],cnt; bool dfs(int u,int v0,int fa){ for(register int i=head[u];i;i=edge[i].nxt){ int v=edge[i].to; if(v==fa) continue; if(v==v0){ if(edge[i].w<r) { mx=max(mx,edge[i].w),mi=min(mi,edge[i].w),num++; pp[++cnt]=edge[i].w; } if(edge[i].w==r) flag=1,num2++; return true; } if(dfs(v,v0,u)){ if(edge[i].w<r) { mx=max(mx,edge[i].w),mi=min(mi,edge[i].w),num++; pp[++cnt]=edge[i].w; } if(edge[i].w==r) flag=1,num2++; return true; } } return false; } void to_do(int m){ int u,v; while(m--){ memset(pp,0,sizeof(pp)); mx=-inf,mi=inf,num=num2=flag=tot=0; scanf("%d%d%d",&u,&v,&r); dfs(u,v,0); if(mi==inf&&!flag) { printf("%d\n",r); continue; } if(mi==inf&&flag){ if(num2&1) puts("0"); else printf("%d\n",r); } if(mi!=inf&&flag){ printf("%d\n",r-mi); } if(mi!=inf&&!flag){ printf("%d\n",r-mi); } } } int main(){ scanf("%d",&n); for(register int i=1;i<n;i++){ int u,v,w; scanf("%d%d%d",&u,&v,&w); Add(u,v,w),Add(v,u,w); } scanf("%d",&m); to_do(m); return 0; }