zoukankan      html  css  js  c++  java
  • 并查集+思维——X-Plosives

    一、问题描述(题目链接

    有n种化合物,每种化合物由两种元素组成。当几种的化合物数量等于他们所含不同元素的数量时,就会发生爆炸。现在依次给出化合物的组成,当新的化合物与之前的化合物放在一起会发生爆炸时,就不能允许这个化合物放进来。输出拒绝的次数。

    二、问题分析

    把元素看成点,化合物看成边,每次新的化合物进来当成连一条边。

    如果图中没有环,则每个连通分量是一棵树,其边数等于点数减1,不可能存在爆炸的情况;如果图中有环,则这个环上点数等于边数,就会爆炸。

    使用并查集连边,如果要连的两个点在同一集合中,则答案加1。

    三、代码实现

     1 #include<stdio.h>
     2 #include<iostream>
     3 #include<algorithm>
     4 #include<cstring>
     5 using namespace std;
     6 
     7 typedef long long LL;
     8 const int maxn = 100000 + 10;
     9 int par[maxn];
    10 int n, ans;
    11 
    12 void init()
    13 {
    14     for (int i = 0; i < maxn; i++)
    15         par[i] = i;
    16 }
    17 
    18 int find_set(int x)
    19 {
    20     if (x != par[x])
    21         par[x] = find_set(par[x]);
    22     return par[x];
    23 }
    24 
    25 void unite(int x, int y)
    26 {
    27     int rootx = find_set(x);
    28     int rooty = find_set(y);
    29 
    30     if (rootx == rooty)            //如果两个元素在同一集合,则会爆炸;此时应拒绝加入,答案加一
    31     {
    32         ans++;
    33         return;
    34     }
    35 
    36     par[rootx] = rooty;
    37 }
    38 
    39 int main()
    40 {
    41     int x,y;
    42     while (scanf("%d",&x) == 1)
    43     {
    44         ans = 0;
    45         init();
    46         while (x != -1)
    47         {
    48             scanf("%d", &y);
    49             unite(x, y);
    50             scanf("%d", &x);
    51         }
    52         printf("%d
    ", ans);
    53     }
    54     return 0;
    55 }
  • 相关阅读:
    微信公众号的开通
    支付宝同步请求检查appid,以及公钥,私钥是否正确
    检查支付宝异步通知是否正确
    支付宝开发者中心添加应用
    js中undefined和null的区别
    判断前端<input>标签是否选中(批量删除时,批量选择复选框)
    P1396 营救+二分+BFS
    P1396 营救+生成树
    P1396 营救+最短路
    P1195 口袋的天空
  • 原文地址:https://www.cnblogs.com/lfri/p/9484600.html
Copyright © 2011-2022 走看看