Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
51575 | xyh | 树上博弈 | C++ | 正在测评 | 0 | 0 MS | 0 KB | 1444 | 2022-07-13 11:53:32 |
#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; }