1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| #include<cstdio> using namespace std; int f[200000]; int ans;int n;int k; int find(int x) { if(f[x]==x) return x; int fx=find(f[x]); return f[x]=fx; } void bing(int a,int b,int c) { int fx=find(b); int fy=find(c); if(a==1) { if(fx==fy) return; if(fx==find(n+c)||fx==find(2*n+c)||fy==find(n+b)||fy==find(2*n+b)) { ans++; return; } f[fx]=f[fy];//自己的祖先是同类 f[find(b+n)]=f[find(c+n)];//吃b的和吃c的是同类 f[find(b+2*n)]=f[find(c+2*n)];//被b吃的和被c吃的是同类 } if(a==2) { if(fx==fy||fx==find(c+2*n)||fy==find(b+n)) { ans++; return; } f[fx]=find(c+n);//b和吃c的是同类 f[fy]=find(b+2*n);//c和被b吃的是同类 f[find(b+n)]=find(c+2*n);//吃b的和被c吃的是同类 } } int main() { scanf("%d%d",&n,&k); for(int i=1;i<=3*n;i++) f[i]=i; for(int i=1;i<=k;i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); if(b>n||c>n) { ans++; continue; } if(b==c&&a==2) { ans++; continue; } bing(a,b,c); } printf("%d",ans); } return 0;
|