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