比赛 寒假集训2 评测结果 AAAAAATTTTTTTTTTTTTT
题目名称 轻重边 最终得分 30
用户昵称 ChenBp 运行时间 15.938 s
代码语言 C++ 内存使用 26.60 MiB
提交时间 2026-02-25 11:14:54
显示代码纯文本
#include <iostream>
#include <cstring>
using namespace std;
const int N=2e5+5;
int head[N],nxt[N],to[N],id[N],num=1;
void add(int u,int v,int i) {
	num++;
	to[num]=v;
	id[num]=i;
	nxt[num]=head[u];
	head[u]=num;
}
int tf[N],fa[N][21],dep[N];
void dfs(int u,int f) {
	fa[u][0]=f;
	dep[u]=dep[f]+1;
	for(int i=1; i<=20; i++) {
		fa[u][i]=fa[fa[u][i-1]][i-1];
	}
	for(int i=head[u]; i; i=nxt[i]) {
		int v=to[i];
		if(v==f) continue;
		tf[v]=id[i];
		dfs(v,u);
	}
}
int lca(int x,int y) {
	if(dep[x]<dep[y]) swap(x,y);
	for(int i=20; i>=0; i--) {
		if(dep[fa[x][i]]>=dep[y]) x=fa[x][i];
	}
	if(x==y) return x;
	for(int i=20; i>=0; i--) {
		if(fa[x][i]!=fa[y][i]) {
			x=fa[x][i];
			y=fa[y][i];
		}
	}
	return fa[x][0];
}
bool z[N];
int ch(int u,int l) {
    int la=0;
	while(u!=l) {
//cout<<"#"<<u<<" "<<fa[u][0]<<endl;
		for(int i=head[u]; i; i=nxt[i]) {
			int v=to[i];
//cout<<"->"<<v<<" "<<id[i]<<endl;
			if(v==fa[u][0]||v==la) {
				z[id[i]]=1;
			} else {
				z[id[i]]=0;
			}
		}
		la=u;
		u=fa[u][0];
	}
	return la;
}
int ask(int u,int l) {
    int ans=0;
	while(u!=l) {
		if(z[tf[u]]) ans++;
		u=fa[u][0];
	}
	return ans;
}
int main() {
    freopen("edge.in","r",stdin);
    freopen("edge.out","w",stdout);
	int t;
	cin>>t;
	while(t--) {
		memset(head,0,sizeof(head));
		memset(z,0,sizeof(z));
		memset(id,0,sizeof(id));
		memset(dep,0,sizeof(dep));
		memset(fa,0,sizeof(fa));
		memset(nxt,0,sizeof(nxt));
		memset(tf,0,sizeof(tf));
		memset(to,0,sizeof(to));
		num=1;
		int n,m;
		cin>>n>>m;
		for(int i=1; i<=n-1; i++) {
			int u,v;
			cin>>u>>v;
			add(u,v,i);
			add(v,u,i);
		}
		dfs(1,0);
		while(m--) {
			int op,u,v;
			cin>>op>>u>>v;
			int l=lca(u,v);
//cout<<"!"<<l<<endl;
			if(op==1) {
			    int f1,f2;
				f1=ch(u,l);
				f2=ch(v,l);
				for(int i=head[l]; i; i=nxt[i]) {
        			int vv=to[i];
        			if(vv==f1||vv==f2) {
        				z[id[i]]=1;
        			} else {
        				z[id[i]]=0;
        			}
        		}
			}else{
			    cout<<ask(u,l)+ask(v,l)<<endl;
            }
//cout<<"@";for(int i=1;i<n;i++)cout<<z[i]<<" ";cout<<endl;
		}
	}
	return 0;
}