当前位置: 代码迷 >> 综合 >> poj 1182 --食物链(经典并查集)
  详细解决方案

poj 1182 --食物链(经典并查集)

热度:51   发布时间:2023-11-06 18:44:00.0

题意:

题目不难看懂,但是做起来感觉很复杂。

思路:

种类并查集的应用,其中关键的几个公式推导感觉不是很好理解,以后回头看也许会有收获。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std; 
int p[50010],r[50010];
int n,k,co;
int find(int x){if(x!=p[x]){int fx=find(p[x]);r[x]=(r[x]+r[p[x]])%3;p[x]=fx;}return p[x];
}
bool uni(int d,int x,int y){int fx=find(x);int fy=find(y);if(fx==fy){if(((r[y]-r[x]+3)%3)!=d) return 1;else return 0;}p[fy]=fx;r[fy]=(r[x]-r[y]+3+d)%3;return 0;
}
void mem(){for(int i=1;i<=n;i++)p[i]=i;memset(r,0,sizeof(r));
} 
int main(){scanf("%d%d",&n,&k);int a,b,d;co=0;mem();for(int i=0;i<k;i++){scanf("%d%d%d",&d,&a,&b);if(a>n||b>n||(a==b&&d==2)){co++;continue; }else if(uni(d-1,a,b)) co++;}printf("%d\n",co);return 0;
}