并查集(删除节点,就是增加一个新的爹)

来源:互联网 发布:qq五笔mac版 编辑:程序博客网 时间:2024/05/22 17:35

题目链接:点击打开链接

代码:

#include<string.h>#include<algorithm>#include<set>#include<stdio.h>using namespace std;int a[1000010];int b[1000010];int find(int x){    return a[x]==x?a[x]:a[x]=find(a[x]);}void  marge(int x,int y){    int fx,fy;    fx=find(x);    fy=find(y);    if(fx!=fy)        a[fx]=fy;}set<int>s;int main(){    int n,m;    int i,k;    int x,y;    int T=1;    while(scanf("%d%d",&n,&m),n|m)    {        k=n;        for(i=0; i<1000000; i++)            a[i]=i;        for(i=0; i<n; i++)            b[i]=i;        char ch;        while(m--)        {            getchar();            scanf("%c",&ch);            if(ch=='M')            {                scanf("%d%d",&x,&y);                marge(b[x],b[y]);            }            else            {                scanf("%d",&x);                b[x]=k;                k++;            }        }        s.clear();        for(i=0; i<n; i++)            s.insert(find(b[i]));        printf("Case #%d: %d\n",T++,s.size());    }    return 0;}
就是用两个数组,一个是找爹用的,另外一个是记录数据用的,但隔离这个点的时候,从新给这个点找一个爹,其他的都和并查集一样。

0 0
原创粉丝点击