| 比赛 |
寒假集训2 |
评测结果 |
AAAAAATTTTTTTTTTTTTT |
| 题目名称 |
轻重边 |
最终得分 |
30 |
| 用户昵称 |
郑霁桓 |
运行时间 |
15.758 s |
| 代码语言 |
C++ |
内存使用 |
10.16 MiB |
| 提交时间 |
2026-02-25 12:21:15 |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
int T,n,m,xx,yy,fa[100005],dep[100005],p[100005],as;
int op,a,b;
vector<int>v[100005],vv;
void dfs(int x){
dep[x]=dep[fa[x]]+1;
for(int i=0;i<v[x].size();i++){
if(v[x][i]==fa[x]) continue;
fa[v[x][i]]=x;
dfs(v[x][i]);
}
return;
}
int main(){
freopen("edge.in","r",stdin);
freopen("edge.out","w",stdout);
cin>>T;
while(T--){
cin>>n>>m;
for(int i=1;i<=n;i++) p[i]=0,v[i].clear();
for(int i=1;i<n;i++){
cin>>xx>>yy;
v[xx].push_back(yy);
v[yy].push_back(xx);
}
dfs(1);
for(int i=1;i<=m;i++){
cin>>op>>a>>b;
if(op==1){
vv.clear();
while(1){
if(dep[a]<dep[b]) swap(a,b);
for(int j=0;j<v[a].size();j++){
if(v[a][j]==fa[a]) p[a]=0;
else p[v[a][j]]=0;
}
if(a==b) break;
vv.push_back(a);
a=fa[a];
}
for(int i=0;i<vv.size();i++) p[vv[i]]=1;
}else{
as=0;
while(1){
if(dep[a]<dep[b]) swap(a,b);
if(p[a]) as++;
a=fa[a];
if(a==b) break;
}
cout<<as<<"\n";
}
}
}
return 0;
}