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