边带权并查集,为什么 WA
30分。
#include<iostream>
#include<stdlib.h>
#include<algorithm>
#include<string.h>
#include<numeric>
#include<vector>
#include<cstdbool>
#include<set>
#include<queue>
using namespace std;
int n,k,opt,x,y,fx,fy,ans;
int d[100005],fa[100005];
int find(int x) {
if(fa[x]==x)
return x;
int root=find(fa[x]);
d[x]=(d[x]+d[fa[x]])%3;
return fa[x]=root;
}
int main() {
scanf("%d %d",&n,&k);
for(int i=1;i<=n;i++)
fa[i]=i;
for(int i=1;i<=k;i++) {
scanf("%d %d %d",&opt,&x,&y);
if(x>n or y>n)
ans++;
else
switch(opt) {
case 1:
fx=find(x); fy=find(y);
if(fx==fy && d[x]!=d[y])
ans++;
else {
if(fx!=fy) {
fa[fy]=fx;
d[fy]=(((d[x]-d[y])%3)+3)%3;
}
}
break;
case 2:
fx=find(x); fy=find(y);
if(x==y)
ans++;
else
if(fx==fy && (((d[x]-d[y])%3)+3)%3==1)
ans++;
else {
if(fx!=fy) {
fa[fx]=fy;
d[fy]=(((d[x]-d[y]+1)%3)+3)%3;
}
}
break;
}
}
printf("%d\n",ans);
}