| 比赛 |
寒假集训2 |
评测结果 |
TTTTTTEEEEEEEEEEEEEE |
| 题目名称 |
轻重边 |
最终得分 |
0 |
| 用户昵称 |
梦那边的没好TM |
运行时间 |
9.071 s |
| 代码语言 |
C++ |
内存使用 |
207.92 MiB |
| 提交时间 |
2026-02-25 11:20:50 |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define foru(a,b,c) for(ll a=b;a<=c;a++)
#define psh(u,v) a[u].push_back(v)
#define p " "
#define endl '\n'
ll n,m,f[5005][20],dep[5005];
bool h[5005];
vector<vector<ll> >a(5005);
void dfs(ll u,ll fa){
f[u][0]=fa;
dep[u]=dep[fa]+1;
foru(i,1,18){
f[u][i]=f[f[u][i-1]][i-1];
}
for(auto v:a[u]){
if(v!=fa){
dfs(v,u);
}
}
}
ll lca(ll u,ll v){
if(dep[u]>dep[v]){
swap(u,v);
}
ll tmp=dep[v]-dep[u];
for(ll i=0;tmp;i++,tmp>>=1){
if(tmp&1){
v=f[v][i];
}
}
if(u==v){
return v;
}
for(ll i=18;i>=0;i--){
if(f[u][i]!=f[v][i]){
u=f[u][i];
v=f[v][i];
}
}
return f[u][0];
}
void init(ll u,ll gf){
ll tmp=u;
while(u!=gf){
for(auto v:a[u]){
if(v!=f[u][0]){
h[v]=0;
}
}
h[u]=0;
u=f[u][0];
}
for(auto v:a[u]){
if(v!=f[u][0]){
h[v]=0;
}
}
h[u]=0;
u=tmp;
while(u!=gf){
h[u]=1;
u=f[u][0];
}
}
ll count(ll u,ll gf){
ll sum=0;
while(u!=gf){
sum+=h[u];
u=f[u][0];
}
return sum;
}
void sol(){
cin>>n>>m;
foru(i,1,n-1){
ll u,v;
cin>>u>>v;
psh(u,v);
psh(v,u);
}
dfs(1,0);
foru(i,1,m){
ll op,x,y;
cin>>op>>x>>y;
ll gf=lca(x,y);
if(op==1){
init(x,gf);
init(y,gf);
}else{
cout<<count(x,gf)+count(y,gf)<<endl;
}
}
}
int main(){
freopen("edge.in","r",stdin);
freopen("edge.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
ll t;
cin>>t;
while(t--){
sol();
}
return 0;
}