CodeForces 445B - DZY Loves Chemistry ( 并查集 )

题意

DZY做化学实验, 有n种试剂, 其中m对能够发生化学反应, 试管初始危险系数为1, 当放入一种试剂与试管中已有试剂能够发生反应, 则危险系数*2, 求最大的危险系数

思路

并查集
将所有能发生化学反应的试剂放在一个集合里, 一个集合中的试剂按照一定顺序加入就一定可以保证每次加入都发生反应。最大危险系数 = 2^(n-集合数量)

AC代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <map>
using namespace std;
const int maxn = 50+5;
int f[maxn];
map<int, int> mp;
typedef long long ll;

int _find(int a){
    if( a != f[a] )
        f[a] = _find(f[a]);
    return f[a];
}

void _union( int a, int b ){
    int aa = _find(a);
    int bb = _find(b);
    if( aa != bb )
        f[bb] = aa;
    return;
}

int main()
{
    int n, m, a, b;
    scanf("%d%d", &n, &m);
    for( int i = 1; i <= n; i++ )
        f[i] = i;
    while(m--){
        scanf("%d%d",&a, &b);
        _union(a, b);
    }
    int all = 0;
    for( int i = 1; i <= n; i++ )
        if(f[i]==i)
             all++;
    ll sum = 1;
    printf("%lld\n",sum<<(n-all));
    return 0;
}

猜你喜欢

转载自blog.csdn.net/jinxisui/article/details/80114197