【codevs 2597】团伙

来源:互联网 发布:js 动态时钟 编辑:程序博客网 时间:2024/05/17 13:39

并查集水题。

#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;int n,m;const int maxn=2*5000+5;int fa[maxn],rank[maxn];int cnt=0;bool used[maxn];int find(int x){    return fa[x]==x?x:fa[x]=find(fa[x]);}void merge(int x,int y){    x=find(x),y=find(y);    if(x==y) return;    if(rank[x]>rank[y]) fa[y]=x;    else     {        fa[x]=y;        if(rank[x]==rank[y]) rank[y]++;    }    return ;}int main(){    memset(used,0,sizeof(used));    memset(rank,0,sizeof(rank));    scanf("%d%d",&n,&m);    for(int i=1;i<=n*2;i++) fa[i]=i;    char a[1];    int x,y;    for(int i=1;i<=m;i++)    {        scanf("%s%d%d",&a,&x,&y);        if(a[0]=='F') merge(x,y);        else         {            merge(x+n,y);            merge(x,y+n);        }    }    for(int i=1;i<=n;i++)    {        x=find(i);        if(!used[x])         {            cnt++;            used[x]=1;        }     }    printf("%d",cnt);    return 0;}