【BZOJ 1370】 团伙

【题目链接】

            https://www.lydsy.com/JudgeOnline/problem.php?id=1370

【算法】

           并查集 + 拆点

 【代码】

           

#include<bits/stdc++.h>
using namespace std;
#define MAXN 1010

int i,n,m,x,y,cnt;
char opt[5];
int a[MAXN];

class DisjointSet
{
        private :
                int s[MAXN<<1];
        public :
                inline void init(int n)
                {
                        int i;
                        for (i = 1; i <= n; i++) s[i]    = i;    
                }    
                inline int get_root(int x)
                {
                        if (s[x] == x) return x;
                        return s[x] = get_root(s[x]);
                }
                inline void merge(int x,int y)
                {
                        s[get_root(x)] = get_root(y);
                }
} S;

int main() 
{
        
        scanf("%d%d",&n,&m);
        S.init(n<<1);
        for (i = 1; i <= m; i++)
        {
                scanf("%s%d%d",&opt,&x,&y);
                if (opt[0] == 'F') S.merge(x,y);
                else 
                {
                        S.merge(x,y+n);
                        S.merge(y,x+n);
                }
        }
        for (i = 1; i <= n; i++) a[i] = S.get_root(i);
        sort(a+1,a+n+1);
        for (i = 1; i <= n; i++)
        {
                if (a[i] != a[i-1]) cnt++;        
        }
        printf("%d\n",cnt);
        
        return 0;
    
}

 

posted @ 2018-07-03 10:09  evenbao  阅读(117)  评论(0编辑  收藏  举报