//普通並查集模板 #include<iostream> using namespace std; const int MAX=10004; int fat[MAX];//存放每一個節點的根節點 //找x的根節點而且把路徑上的每一個節點的父節點改爲根節點 int find(int x) //while找根節點 { int rt=x; while(fat[rt]!=rt) rt=fat[rt]; int i=x,j; while(i!=rt){ j=fat[i]; fat[i]=rt; i=j; } return rt; } int Find(int x) //遞歸找根節點 { if(fat[x]!=x) fat[x]=Find(fat[x]); return fat[x]; } void connect(int x,int y) //x的根節點合併到y的根節點上 { int xx=find(x),yy=find(y); if(xx!=yy) fat[xx]=yy; } int main() { return 0; } ********************************************************** //算點的轉移次數 #include<iostream> #include<cstring> using namespace std; const int MAX=10004; int fat[MAX];//存放每一個節點的根節點 int num[MAX];//記錄節點的轉移次數 int cnt[MAX];//某點的權值 int find(int x) { if(fat[x]!=x){ int tmp=fat[x]; fat[x]=find(fat[x]); num[x]+=num[tmp];//x點轉移的次數是他的轉移次數加上父節點的轉移次數。 } return fat[x]; } void connect(int x,int y) { int xx=find(x),yy=find(y); if(xx!=yy){ fat[xx]=yy; num[xx]++;//開始轉移了一次 cnt[yy]+=cnt[xx];//權值轉移了 } } int main() { memset(num,0,sizeof(num)); return 0; }