40pts求助
查看原帖
40pts求助
492153
nanzjz1楼主2021/8/29 17:30

用了路径压缩,代码中还用了按秩合并(已注释掉),但不知为何还是会多合并几个人。希望大佬们帮忙看看。

#include <iostream>
#include <cstdio>
using namespace std;
int fr[2010],cnt[2010];
inline int getfr(int i)
{//找代表元素
    if(fr[i]==i)
    {
        return i;
    }
    //cnt[fr[i]]+=cnt[i];
    return fr[i]=getfr(fr[i]);
}
/*inline bool mgr_symbol(int a,int b)
{
    /*if(cnt[getfr(a)]>cnt[getfr(b)])
    {
        return true;
    }
    return false;
}*/
inline void mgr(int a,int b)
{
    /*if(mgr_symbol(a,b))
    {
        fr[fr[b]]=fr[a];
        return;
    }
    fr[fr[a]]=fr[b];*/
    //合并,原本有一个按秩合并
    fr[getfr(b)]=getfr(a);
}
int main()
{
    int n,m;scanf("%d%d",&n,&m);
    for(register int i=1;i<=n*2;++i)
    {//初始化
        fr[i]=i;
    }
    /*for(register int i=1;i<=n;++i)
    {
        cnt[i]=1;
    }*/
    for(register int i=1;i<=m;++i)
    {
        char c[2];int a,b;
        scanf("%s%d%d",&c,&a,&b);
        if(c[0]=='F')
        {//朋友间合并
            mgr(a,b);
            mgr(a+n,b+n);
            continue;
        }//仇人间合并
        mgr(a,b+n);
        mgr(b,a+n);
    }
    for(register int i=1;i<=n;++i)
    {
        fr[i]=getfr(i);
    }
    register int ans=0;
    for(register int i=1;i<=n;++i)
    {
        if(fr[i]==i)
        {
            ++ans;
        }
    }
    printf("%d",ans);
    return 0;
}

2021/8/29 17:30
加载中...