现在的位置: 首页 > 综合 > 正文

rqnoj-57-团伙

2013年03月08日 ⁄ 综合 ⁄ 共 812字 ⁄ 字号 评论关闭

裸的并查集。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;

const int maxn=1000+10;
const int maxm=5000+10;

int n,m;
int f[maxn];
int vis[maxn];
int e[maxm];

void init()
{
	freopen("gang.in","r",stdin);
	freopen("gang.out","w",stdout);
}

int find(int x)
{
    return f[x] == x ? x : f[x]=find(f[x]);
}

void readdata()
{
	scanf("%d%d\n",&n,&m);
	char s;int x,y;
	for(int i=1;i<=n;i++) f[i]=i;
	memset(e,0,sizeof(e));
	for(int i=1;i<=m;i++)
	{
		scanf("%c%d%d\n",&s,&x,&y);
		if(s=='F')
        {
            f[find(x)]=find(y);
		}
        if(s=='E')
        {
            if(e[x]==0)
            {
                e[x]=y;
            }
            else
            {
                if(f[find(e[x])]!=find(y))
                f[find(e[x])]=find(y);
            }
            if(e[y]==0)
            {
                e[y]=x;
            }
            else
            {
                if(f[find(e[y])]!=find(x))
                f[find(e[y])]=find(x);
            }
        }
	}
}

void work()
{
	memset(vis,0,sizeof(vis));
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		if(vis[find(i)]) continue;
		vis[find(i)]=1;
		ans++;
	}
	printf("%d",ans);
}

int main()
{
	init();
	readdata();
	work();
	return 0;
}

抱歉!评论已关闭.