P1892 [BOI2003]团伙(并查集,反集)难度⭐⭐★

题目链接

反集

如果ab是敌人,合并n+ban+ab
如果ca是敌人,合并n+can+ac
那么bc自然就合并在一起了
这样就符合了题目敌人的敌人是朋友的规则

注意

并查集不要忘了初始化

注意

输入的时候scanf要用%s 因为scanf遇见空格是不会跳的,所以尽量这种时候就不要用scanf,比较麻烦,cin它不香嘛

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e5+7;
const ll mod=2147483647;
ll n,m;
ll f[N];
inline void init()//并查集必须要初始化!
{
    for(int i=1;i<=(n<<1|1);++i)
        f[i]=i;
}
inline ll finds(ll x)
{
    return f[x]==x?x:f[x]=finds(f[x]);
}
inline void add(ll x,ll y)
{
    x=finds(x);
    y=finds(y);
    f[x]=y;
}
inline bool check(ll x,ll y)
{
    x=finds(x);
    y=finds(y);
    return x==y;
}
int main()
{
    scanf("%lld %lld",&n,&m);
    init();
    for(int i=1;i<=m;++i)
    {
        ll a,b;
        char ch[2];
        scanf("%s%lld%lld",&ch,&a,&b);//注意这一点要用%s 因为scanf遇见空格是不会跳的,所以尽量这种时候就不要用scanf,比较麻烦,cin它不香嘛
        //cin>>ch>>a>>b;
        if(ch[0]=='F')add(a,b);
        else {
            add(a+n,b);//反集
            add(b+n,a);//敌人的敌人就是我的朋友
        }
    }
    ll ans=0;
    for(int i=1;i<=n;++i)//查祖先数
        if(f[i]==i)ans++;
    printf("%lld\n",ans);
    return 0;
}

注:如果您通过本文,有(qi)用(guai)的知识增加了,请您点个赞再离开,如果不嫌弃的话,点个关注再走吧 ! 当然,也非常欢迎您能在讨论区指出此文的不足处,作者会及时对文章加以修正 !如果有任何问题,欢迎评论,非常乐意为您解答!( •̀ ω •́ )✧

全部评论

相关推荐

当年还在美团那个倒霉的&nbsp;Peppr&nbsp;团队工作时,我一直有个疑问:这群人每天到底在自嗨什么。每次开会一堆人围着一堆“看起来很高级”的文档转,模板统一、名词复杂、页数感人,每一页都在暗示一件事:“你不懂,是因为你不专业。”但现实是——代码照样写在&nbsp;💩&nbsp;山上,该出问题还是会出问题,这真的很逗,系统一出问题,文档的唯一作用就是证明:“我们当初确实认真写过文档。”所以本质区别到底是什么?是代码质量提升了,还是大家在精神层面完成了一次“工程师&nbsp;cosplay”?有句话说得好潮水退去才知道谁在裸泳。还记得当时的马哥、明哥(图&nbsp;1&nbsp;左)最爱反复强调一句话:“所有场景一定要想到。”、“这个场景为什么没考虑到?”不过他们这些话我是真的听进去了。不然我也不会在一年多前就说:这个项目活不过两年。顺带一提,那段时间还有个固定节目。每次下楼,总能听见我明哥在吐槽不同的人。我从他身后绕过去,经常能听到他一边抽烟一边说:“xx&nbsp;这小子太坑了,回头我一定要跟马哥说说。”于是深谙人情世故但真不会抽烟的我也会从口袋掏出一支低尼古丁含量的烟给自己点上,假意自己什么都没听到什么都不知道,只是来抽烟的。后来我才明白,这可能也是团队文化的一部分:问题永远在别人身上,而我们,永远在复盘里😂。
秋招白月光
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务