和食物链一样的思想。
还是师兄对并查集的研究比较深入啊。orz!今天对并查集的理解,更上一层楼。
并查集基本思想:每次合并的时候,修改的是一部分点到根节点的值,然后再find()里面,再进行更新。
#include<iostream> #include<cstdio> #include<string> using namespace std; #define N 100005 int p[N],r[N]; int n,m; int find(int a) { if(p[a]==a) return a; int t=find(p[a]); r[a]=(r[p[a]]+r[a])%2; p[a]=t; return t; } void unin(int a,int b,int f1,int f2) { p[f2]=f1; r[f2]=(r[a]+1+r[b])%2; } int main() { int t,i,a,b,k1,k2; char ch; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); scanf("%c",&ch); for(i=1;i<=n;i++) { p[i]=i; r[i]=0; } while(m--) { cin>>ch; scanf("%d%d",&a,&b); if(ch=='A') { k1=find(a);k2=find(b); if(k1!=k2) printf("Not sure yet.\n"); else { if(r[a]!=r[b]) printf("In different gangs.\n"); else printf("In the same gang.\n"); } } else { k1=find(a);k2=find(b); if(k1!=k2) unin(a,b,k1,k2); } } } return 0; }
本文深入探讨了并查集的基本思想及其在解决特定问题时的应用。通过实例代码讲解了如何利用并查集来判断节点间的关系,包括是否属于同一集合及它们之间的相对位置等,并展示了并查集在合并操作中的效率提升技巧。
173

被折叠的 条评论
为什么被折叠?



