int n, m; int q[102]; int head[10004], tot; structEdge { int from, to, next, cost; } edge[20004]; int rt, sum; int rem[10004], sz[10004], mxz[10004], dis[10004], rsv[10004]; // rem存出现过的路径, sz为子树大小, mxz是以该点为根最大的子树大小, dis是到根的距离, rsv是存的rem, 还原现场用 bool vis[10004], judge[100000008], ans[102];
voidAddedge(int u, int v, int e) { edge[++ tot] = (Edge){u, v, head[u], e};
head[u] = tot; }
voidGet_rt(int u, int fa)// 在子树中寻找重心当作子树的根 { sz[u] = 1; mxz[u] = 0; // 以u为根节点, 最大子树的大小
for(int i = head[u]; i; i = edge[i].next) { int v = edge[i].to;
if(v == fa || vis[v]) continue;
Get_rt(v, u); sz[u] += sz[v];
mxz[u] = std:: max(mxz[u], sz[v]); }
mxz[u] = std:: max(mxz[u], sum - sz[u]); // 这里是为了处理当前u和上一层的根节点的那些节点, 有点特殊
if(mxz[u] < mxz[rt]) rt = u; }
voidGet_dis(int u, int fa)// 得到子树每个点到根节点的距离 { rem[++ rem[0]] = dis[u];
for(int i = head[u]; i; i = edge[i].next) { int v = edge[i].to, e = edge[i].cost;
if(v == fa || vis[v]) continue;
dis[v] = dis[u] + e; Get_dis(v, u); } }
voidCal(int u)// 计算答案 { int cnt = 0;
for(int i = head[u]; i; i = edge[i].next) { int v = edge[i].to, e = edge[i].cost;