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