比赛 寒假集训2 评测结果 AAAAAATTTTTTTTATTTTT
题目名称 轻重边 最终得分 35
用户昵称 张雨晴 运行时间 15.618 s
代码语言 C++ 内存使用 9.60 MiB
提交时间 2026-02-25 11:11:22
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
const int M=500005;
int t;
int fa[M];
int d[M];
int bj[M];
int hed[M];
int nxt[M],h[M],to[M],cnt;
void add(int a,int b){
    to[++cnt]=b;
    nxt[cnt]=h[a];
    h[a]=cnt;
}
void f(int k,int p){
    for(int i=h[k];i;i=nxt[i]){
        int j=to[i];
        if(j==p) continue;
        fa[j]=k;
        hed[j]=i;
        d[j]=d[k]+1;
        f(j,k);
    }
}
void iit(int l){
    cnt=0;
    for(int i=0;i<=l*2+10;i++){
        fa[i]=d[i]=bj[i]=hed[i]=nxt[i]=h[i]=to[i]=0;
    }
}
void rs(int i,int c){
//    cout<<i<<" "<<c<<"\n";
    bj[i]=c;
    if(i%2==0){
        bj[i-1]=c;
//        cout<<i-1<<" "<<c<<"\n";
    }else{
        bj[i+1]=c;
//        cout<<i+1<<" "<<c<<"\n";
    }
}
int main(){
    freopen("edge.in","r",stdin);
    freopen("edge.out","w",stdout);
    cin>>t;
    while(t--){
        //多测清空! 
        int n,m;
        cin>>n>>m;
        iit(n);
        for(int i=1;i<=n-1;i++){
            int u,v;
            cin>>u>>v;
            add(u,v);
            add(v,u);
        }
        f(1,0);
//        for(int i=1;i<=n;i++) cout<<fa[i]<<" ";
//        cout<<"\n";
        while(m--){
            int op,x,y;
            cin>>op>>x>>y;
            if(op==1){
                if(d[x]>d[y]) swap(x,y);
                int now=y;
                int ds=x;
                while(d[now]!=d[ds]){
                    for(int i=h[now];i;i=nxt[i]){
                        rs(i,0);
                    }
                    now=fa[now];
                }
                while(now!=ds){
                    for(int i=h[now];i;i=nxt[i]){
                        rs(i,0);
                    }
                    for(int i=h[ds];i;i=nxt[i]){
                        rs(i,0);
                    }
                    now=fa[now];
                    ds=fa[ds];
                }
                for(int i=h[now];i;i=nxt[i]){
                    rs(i,0);
                }
                
                now=y;
                ds=x;
                while(d[now]!=d[ds]){
                    rs(hed[now],1);
                    now=fa[now];
                }
                while(now!=ds){
                    rs(hed[now],1);
                    rs(hed[ds],1);
                    now=fa[now];
                    ds=fa[ds];
                }
            }else{
                
                if(d[x]>d[y]) swap(x,y);
                int now=y;
                int ds=x;
                int ans=0;
                while(d[now]!=d[ds]){
//                    cout<<bj[hed[now]]<<"\n";
                    if(bj[hed[now]]==1){
                        ans++;
                    }
                    now=fa[now];
                }
                while(now!=ds){
//                    cout<<bj[hed[now]]<<" "<<bj[hed[ds]]<<"\n";
                    if(bj[hed[now]]==1){
                        ans++;
                    }
                    if(bj[hed[ds]]==1){
                        ans++;
                    }
                    now=fa[now];
                    ds=fa[ds];
                }
                cout<<ans<<"\n";
            }
        }
    }
    return 0;
}