比赛 寒假集训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;
}