20分,求助
查看原帖
20分,求助
1123752
clo201111楼主2025/8/31 22:03

边带权并查集,为什么 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);
}

2025/8/31 22:03
加载中...