//带偏移量的并查集≈并查集补集 //维护各点到父节点的距离 可用来分类 #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> using namespace std; int n,f[1001],d[1001]; int find(int x) { if(x==f[x]) return x; d[x]+=d[f[x]]; return f[x]=find(f[x]); } int get(int x,int y) { int xx=find(x); int yy=find(y); if(xx!=yy) f[xx]=yy; } int main() { cin>>n; for(int i=1;i<=n;i++) f[i]=i; for(int i=1;i<=n;i++) { int u,v; cin>>u>>v; get(u,v); } return 0; }
原文:https://www.cnblogs.com/water-radish/p/9280539.html