UVA 1160 - X-Plosives(并查集)

本文介绍了一种使用并查集解决化学元素化合物危险性判断的经典算法问题。通过将元素视为顶点建立边,判断形成环的化合物是否危险。详细解释了最小生成树算法在该问题中的应用,提供了具体的代码实现。

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

题目地址

很经典的并查集题目,一开始我们或许觉得无从下手,但是仔细观察可以发现,他的规定很有意思: 如果存在k个化合物,正好包含k种元素 。似乎不能简单的判断所有元素种类是否在一个集合中 。但是如果我们把每个元素看成顶点,则一个简单化合物就是一条边, 不难发现,当整个图存在环的时候,组成环的边对应的化合物恰好是危险的。

所以就像最小生成树算法一样维护图的联通分量就行了。

细节参见代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 5;
const int INF = 1000000000;
int k,id,a,cnt,b,p[maxn];
struct Edge{
    int a,b;
    Edge(int a=0,int b=0):a(a), b(b) {}
}c[maxn];
int findset(int x) { return p[x] == x ? x : p[x] = findset(p[x]); }
int main() {
    while(~scanf("%d%d",&a,&b)) {
        cnt = 0;
        int max_id = max(a,b), ans = 0;
        c[cnt++] = Edge(a,b);
        while(scanf("%d",&a)) { //输入
            if(a == -1) break;
            scanf("%d",&b);
            max_id = max(max_id,max(a,b));
            c[cnt++] = Edge(a,b);
        }
        for(int i = 1; i <= max_id; i++) p[i] = i;//初始化并查集
        for(int i=0;i<cnt;i++) { //solve
            int x = findset(c[i].a), y = findset(c[i].b);
            if(x != y) p[x] = y;
            else ans++;
        }
        printf("%d\n",ans);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值