LA 3644 X-Plosives (简单并查集) 判断是否存在环

本文探讨了一种名为X-Plosives的算法问题,该问题涉及如何在避免形成特定组合导致爆炸的情况下,安全地装载一系列由两种不同简单化合物组成的绑定对。通过使用图论中的环检测方法,文章提供了一个解决方案,确保了在接收化合物序列时的安全处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

X-Plosives

 

A secret service developed a new kind ofexplosive that attain its volatile property only when a specific association ofproducts occurs. Each product is a mix of two different simple compounds, towhich we call abinding pair. If N>2, thenmixing N different binding pairs containing N simple compounds creates apowerful explosive.For example, the bindingpairs A+B, B+C, A+C (three pairs, three compounds) result in an explosive,while A+B, B+C, A+D (three pairs, four compounds) does not.

 

You are not a secret agent but only a guyin a delivery agency with one dangerous problem: receive binding pairs insequential order and place them in a cargo ship. However, you must avoidplacing in the same room an explosive association. So, after placing a set ofpairs, if you receive one pair that might produce an explosion with some of thepairs already in stock, you must refuse it, otherwise, you must accept it.

 

An example. Let’s assume you receive thefollowing sequence: A+B, G+B, D+F, A+E, E+G, F+H. You would accept the firstfour pairs but then refuse E+G since it would be possible to make the followingexplosive with the previous pairs: A+B, G+B, A+E, E+G (4 pairs with 4 simplecompounds). Finally, you would accept the last pair, F+H.

 

Compute thenumber of refusals given a sequence of binding pairs.

 

Input

The input will contain several test cases, each of them as described below.Consecutive test cases are separated by a single blank line.
Instead of letters we will use integersto represent compounds. The input contains several lines. Each line(except the last) consists of two integers (each integer lies between 0 and 105)separated by a single space, representing a binding pair. The input ends in aline with the number –1. You may assume that no repeated binding pairsappears in the input.

 

Output

For each test case, a single line with the number ofrefusals.

 

Sample Input

1 2

3 4

3 5

3 1

2 3

4 1

2 6

6 5

-1

 

Sample Output

3

题意:   有一些简单化合物   每个化合物由2中不同元素组成        然后按照顺序依次将这些化合物放进车里   但是如果车上存在k个简单化合物 且正好包含k中元素的话

那么他们将变成易爆的化合物   为安全起见     每当你拿到一个化合物的时候   如果它和已装车的化合物形成易爆化合物   你就应当拒绝装车  否则就应该装车 。请输出有多少个化合物没有装车
分析: 把每个元素看做一个点,判断是否存在环,若加入的化合物可以构成环则不装车,否则装车。

代码:(未经评测,参考刘汝佳入门指南)

 

#include<cstdio>
using namespace std;
const int maxn=1e5+8;
int a[maxn];
int findset(int x)
{
    return a[x]==x? x:findset(a[x]);///路径压缩
}
int main()
{
    int x,y,ans=0;
    for(int i=0;i<=maxn;i++) a[i]=i;
    while(scanf("%d",&x)==1)
    {
        while(x!=-1)
        {
            scanf("%d",&y);
            int x1=findset(x);
            int y1=findset(y);
            if(x1==y1) ans++;
              else a[x1]=y1;
            scanf("%d",&x);
        }
        printf("%d\n",ans);
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会敲代码的小帅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值