并查集(易爆物,LA 3644)

看清题啊大哥。。。人家说存在k个,正好包含k种。你看成了刚好k个,刚好k种,然后在那用什么set搞来搞去,还出了bug然后刚好过了样例,神逗。

先验证解法的正确性,再去编写代码,别浪呀,万一没想清楚甚至读错题就爆炸啦。

好吧,其实中文题目还是有点没说清楚的吧。以后还是看英文原题好了。


英文原题就是说如果将N个不同的化合物放在一起恰好有N种元素,就会爆炸,还用成环解释了一波。这不就懂了嘛= =。


判断成环的方法我只知道,dfs,拓扑排序,还有个什么Bellman-Ford,还有个什么Floyd判圈算法。其中拓扑排序只适用于有向图,Bellman-Ford太低效以及大材小用了,Floyd判圈算法速度很慢,但缺点是不需要建图,一般用于更抽象的数学问题而不是用于解决图论上的问题。其实突然想起来大半年前做过一道题,在某些时候,并查集可以一战。因为并查集可以判断连通,所以某些时候也可以判断环的,但缺点是无向。比如最小生成树里面不就用来判断新加入的边是否成环了么。他可以判断一条新加入的边是否连在同一个连通块上。所以说某种程度上也算是判断环的方法。然后其实这道题本质上不就是生成树么= =。


代码

#include<bits/stdc++.h>
#define maxn 100010
using namespace std;

int fa[maxn];

void init()
{
    for(int i=0;i<maxn;i++) fa[i]=i;
}

int f(int x)
{
    return x==fa[x]?x:fa[x]=f(fa[x]);
}

int main()
{
    while(1)
    {
        init();
        int x,y;
        int cnt=0;
        while(1)
        {
            if(scanf("%d",&x)==EOF) return 0;
            if(x==-1)
            {
                printf("%d\n",cnt);
                break;
            }
            scanf("%d",&y);
            int a=f(x);
            int b=f(y);
            if(a==b) cnt++;
            else fa[a]=b;
        }
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值