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