C++——并查集

    技术2022-07-11  97

    直接上代码

    代码

    #include<iostream> #include<algorithm> #include<cstring> using namespace std; int pre[1050]; //带路径压缩 int find(int x){ int r=x; while(r!=pre[r]) r=pre[r]; int i=x,j; while(pre[i]!=r){ j=pre[i]; pre[i]=r; i=j; } return r; } void join(int x,int y){ int fx=find(x),fy=find(y); if(fx!=fy){ if(fx<fy) pre[fy]=fx; else pre[fx]=fy; } } int main(){ int num,edgeNum; cin>>num>>edgeNum; for(int i=0;i<num;i++) pre[i]=i; while(edgeNum--){ int a,b; cin>>a>>b; join(a,b); } for(int i=0;i<num;i++) cout<<find(i)<<endl; /*如果用pre[i]的话, 可能还有部分结点在结束循环时还未进行路径压缩 所以如果要找到一个结点的根父结点最好使用find函数 */ return 0; } /* 测试数据: 5 4 0 1 0 3 2 4 0 4 结果: 0 0 0 0 0 如果最后打印使用pre[i]的话,输出就是 0 0 0 0 2 */
    Processed: 0.027, SQL: 12