| 比赛 |
寒假集训2 |
评测结果 |
WWWWWWTTTTTTTTWTTTTT |
| 题目名称 |
轻重边 |
最终得分 |
0 |
| 用户昵称 |
123 |
运行时间 |
15.177 s |
| 代码语言 |
C++ |
内存使用 |
11.96 MiB |
| 提交时间 |
2026-02-25 11:00:06 |
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10,M=2e5+10,K=22;
int t,n,m,head[N],nxt[M],idx[M],fa[N],q[N],f[N][K],depth[N],tot=0;
void dfs(int now,int qfa)
{
fa[now]=qfa,f[now][0]=qfa,depth[now]=depth[qfa]+1;
for (int i=1;i<=20;i++) f[now][i]=f[f[now][i-1]][i-1];
for (int i=head[now];i;i=nxt[i])
{
int y=idx[i];
if (y==qfa) continue;
dfs(y,now);
}
}
int lca(int x,int y)
{
if (depth[x]<depth[y]) swap(x,y);
for (int i=20;i>=0;i--)
{
if (depth[f[x][i]]>=depth[y]) x=f[x][i];
}
if (x==y) return x;
for (int i=20;i>=0;i--)
{
if (f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
}
return f[x][0];
}
void add(int x,int y)
{
idx[++tot]=y;
nxt[tot]=head[x];
head[x]=tot;
}
int main() {
freopen("edge.in","r",stdin);
freopen("edge.out","w",stdout);
ios::sync_with_stdio(0),cin.tie(0);
cin>>t;
while (t--)
{
for (int i=1;i<=n;i++) head[i]=q[i]=0;
tot=0;
cin>>n>>m;
for (int i=1;i<n;i++)
{
int x,y;
cin>>x>>y;
add(x,y),add(y,x);
}
dfs(1,0);
while (m--)
{
int op,x,y;
cin>>op>>x>>y;
if (op==1)
{
int k=lca(x,y),lst1=0,lst2=0;
for (int i=x;i!=k;i=fa[i])
{
q[i]=1;
for (int j=head[i];j;j=nxt[j])
{
int w=idx[j];
if (w==lst1 || fa[i]==w) continue;
q[w]=0;
}
lst1=i;
}
for (int i=y;i!=k;i=fa[i])
{
q[i]=1;
for (int j=head[i];j;j=nxt[j])
{
int w=idx[j];
if (w==lst2 || fa[i]==w) continue;
q[w]=0;
}
lst2=i;
}
for (int j=head[k];j;j=nxt[j])
{
int w=idx[j];
if (w==lst1 || w==lst2 || w==fa[k]) continue;
q[w]=0;
}
}
else
{
int cnt=0,k=lca(x,y);
for (int i=x;i!=k;i=fa[i]) cnt+=q[i];
for (int i=y;i!=k;i=fa[i]) cnt+=q[i];
cout<<cnt<<endl;
}
}
}
}