比赛 寒假集训2 评测结果 AAAAATTTTTTTTTTTTTTT
题目名称 轻重边 最终得分 25
用户昵称 rzzakioi 运行时间 17.825 s
代码语言 C++ 内存使用 15.55 MiB
提交时间 2026-02-25 10:45:50
显示代码纯文本
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<map>
using namespace std;
int t,n,m,d[100005],f[100005];
vector<int>g[100005];
int to[200005],nxt[200005],h[200005],cnt;
map<pair<int,int>,bool>mp;
void add(int u,int v){
    to[++cnt]=v;
    nxt[cnt]=h[u];
    h[u]=cnt;
}
void dfs(int u,int fa){
    d[u]=d[fa]+1;
    f[u]=fa;
    add(fa,u);
    for(auto v:g[u]){
        if(v==fa)continue;
        dfs(v,u);
    }
}
void solve(int x,int y){
    if(d[x]<d[y])swap(x,y);
    int sonx=-1;
    while(d[x]>d[y]){
        for(int i=h[x];i;i=nxt[i]){
            int v=to[i];
            mp[make_pair(x,v)]=0;
//            printf("delete%d %d\n",x,v);
        }
        if(sonx!=-1){
            mp[make_pair(x,sonx)]=1;
//            printf("add%d %d\n",x,sonx);
        }
        sonx=x;
        x=f[x];
    }
    int sony=-1;
    while(x!=y){
        for(int i=h[x];i;i=nxt[i]){
            int v=to[i];
            mp[make_pair(x,v)]=0;
//            printf("delete%d %d\n",x,v);
        }
        if(sonx!=-1){
            mp[make_pair(x,sonx)]=1;
//            printf("add%d %d\n",x,sonx);
        }
        sonx=x;
        x=f[x];
        for(int i=h[y];i;i=nxt[i]){
            int v=to[i];
            mp[make_pair(y,v)]=0;
//            printf("delete%d %d\n",y,v);
        }
        if(sony!=-1){
            mp[make_pair(y,sony)]=1;
//            printf("add%d %d\n",y,sony);
        }
        sony=y;
        y=f[y];
    }
    mp[make_pair(f[x],x)]=0;
//    printf("delete%d %d\n",f[x],x);
    for(int i=h[x];i;i=nxt[i]){
        int v=to[i];
        mp[make_pair(x,v)]=0;
//            printf("delete%d %d\n",x,v);
    }
    if(sonx!=-1){
        mp[make_pair(x,sonx)]=1;
//        printf("add%d %d\n",x,sonx);
    }
    if(sony!=-1)mp[make_pair(y,sony)]=1;
//    printf("LCA:%d\n",x);
}
int query(int x,int y){
    int ans=0;
    if(d[x]<d[y])swap(x,y);
    while(d[x]>d[y]){
        ans+=mp[make_pair(f[x],x)];
        x=f[x];
    }
    
    while(x!=y){
        ans+=mp[make_pair(f[x],x)];
        x=f[x];
        ans+=mp[make_pair(f[y],y)];
        y=f[y];
    }
//    printf("LCA:%d\n",x);
    return ans;
}
int main(){
    freopen("edge.in","r",stdin);
    freopen("edge.out","w",stdout);
    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&n,&m);
        for(int i=0;i<=n;i++)g[i].clear();
        memset(to,0,sizeof(to));
        memset(nxt,0,sizeof(nxt));
        memset(h,0,sizeof(h));
        memset(d,0,sizeof(d));
        memset(f,0,sizeof(f));
        cnt=0;
        mp.clear();
        for(int i=1;i<n;i++){
            int u,v;
            scanf("%d%d",&u,&v);
            g[u].push_back(v);
            g[v].push_back(u);
        }
        dfs(1,0);
        for(int i=1;i<=m;i++){
            int op,a,b;
            scanf("%d%d%d",&op,&a,&b);
            if(op==1)solve(a,b);
            else printf("%d\n",query(a,b));
        }
    }
    return 0;
}