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