HDU 2473 Junk-Mail Filter

题目链接:HDU 2473 Junk-Mail Filter
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
照着模板敲,还写了一上午,菜死QAQ

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;
const int N = 1200005;
int pre[N];
int vis[N];
int index;


void init(int n)
{
	index = n;
	for(int i=0;i<n;i++)	//普通节点指向他的盒子节点
		pre[i] = index++;
	for(int i=n;i<2*n;i++)	//盒子节点指向自己就像一般的并查集一样
		pre[i] = i;
}

int find(int x)
{
	if(x!=pre[x])
        return pre[x] = find(pre[x]);
    return x;
}

void Union(int x,int y)
{
	x = find(x);
	y = find(y);
	if(x!=y)
		pre[y] = x;
}

void del(int x)
{
	pre[x] = index; //将要删除的节点重新指向一个新的盒子
	pre[index] = index++;	//盒子节点指向自己
}

int main()
{
	int n,m;
	int cnt = 1;
	while(cin>>n>>m&&n+m)
	{
		init(n);
		while(m--)
		{
			char s;
			int a,b,c;
			cin>>s;
			if(s == 'M')
			{
				cin>>a>>b;
				Union(a,b);
			}
			else
			{
				cin>>c;
				del(c);
			}
		}
		
		int sum=0;
		memset(vis,0,sizeof(vis));	//每组测试样例都要置零,老是忘 
        for(int i=0;i<n;i++)//枚举所有点,查看是否还在集合内
        {
            int x=find(i);
            if(vis[x]==0)//若某点不在集合中
            {
                sum++;
                vis[x]=1;
            }
        }
		cout<<"Case #"<<cnt++<<":"<<" "<<sum<<endl;
	}
	return 0;
 } 

猜你喜欢

转载自blog.csdn.net/qq_42815188/article/details/88741031