比赛 寒假集训2 评测结果 AAAAAATTTTTTTTATTTTT
题目名称 轻重边 最终得分 35
用户昵称 ychyyx 运行时间 15.469 s
代码语言 C++ 内存使用 10.98 MiB
提交时间 2026-02-25 11:19:04
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<vector>
#include<cmath>
using namespace std;
int T;
int n,m;
int u,v;
vector<pair<int,int> > g[100005];
bool b[100005];
int dep[100005];
int f[100005][2];
int opt,x,y;
void dfs(int u,int fa){
    dep[u]=dep[fa]+1;
    f[u][0]=fa;
    for(int j=0;j<g[u].size();j++){
        int v=g[u][j].first;
        if(v==fa){
            f[u][1]=g[u][j].second;
            continue;
        }
        dfs(v,u);
    }
} 
bool check(int u,int v){
    for(int j=0;j<g[u].size();j++)
        if(g[u][j].first==v)
            return true;
    return false;
}
void ds(){
    scanf("%d%d",&n,&m);
    for(int i=0;i<=n;i++){
        b[i]=0;
        g[i].clear();
        dep[i]=f[i][0]=f[i][1]=0;
    }
    for(int i=1;i<n;i++){
        scanf("%d%d",&u,&v);
        g[u].push_back(make_pair(v,i));
        g[v].push_back(make_pair(u,i));
    }
    dfs(1,0);
    for(int i=1;i<=m;i++){
        scanf("%d%d%d",&opt,&x,&y);
        if(opt==1){
    
            if(check(x,y)){
                int k=0;
                for(int j=0;j<g[x].size();j++){
                    b[g[x][j].second]=0;
                    if(g[x][j].first==y)
                        k=g[x][j].second;
                }
                for(int j=0;j<g[y].size();j++){
                    b[g[y][j].second]=0;
                }
                b[k]=1;
                continue;
            }
            
            if(dep[x]<dep[y])   swap(x,y);
            int w=0;
            while(dep[x]>dep[y]){
                for(int j=0;j<g[x].size();j++){
                    b[g[x][j].second]=0;
                }
                b[f[x][1]]=1;
                b[w]=1;
                w=f[x][1];
                x=f[x][0];
            }
            if(x==y){
                for(int j=0;j<g[x].size();j++){
                    b[g[x][j].second]=0;
                }
                b[w]=1;
                continue;
            }
            int w1=0;
            while(x!=y){
               for(int j=0;j<g[x].size();j++){
                   b[g[x][j].second]=0;
               }
               b[f[x][1]]=1;
               b[w]=1;
               w=f[x][1];
               x=f[x][0];
               for(int j=0;j<g[y].size();j++){
                   b[g[y][j].second]=0;
               }
               b[f[y][1]]=1;
               b[w1]=1;
               w1=f[y][1];
               y=f[y][0];
            }
            for(int j=0;j<g[x].size();j++){
                b[g[x][j].second]=0;
            }
            b[w]=1;
            b[w1]=1;
        }else{
            long long ans=0;
            if(dep[x]<dep[y])   swap(x,y);
            while(dep[x]>dep[y]){
                ans+=b[f[x][1]];
                x=f[x][0];
            }
            while(x!=y){
                ans+=b[f[x][1]];
                ans+=b[f[y][1]];
                x=f[x][0];
                y=f[y][0];
            }
            printf("%lld\n",ans);
        }
    }
}
int main(){
    freopen("edge.in","r",stdin);
    freopen("edge.out","w",stdout);
    scanf("%d",&T);
    while(T--){
        ds();
    }    
    return 0;
}