HDU2473 - Junk-Mail Filter: http://acm.hdu.edu.cn/showproblem.php?pid=2473
题目大意: M a b,代表a和b是同一类的,S a,代表原先给出的a的信息是错的,现在将其单独分成一类. 求最后一共有多少类邮件.
若只是分类,很直接就会想到并查集.但这里若直接用并查集是会出错的,因为删除的那个节点后面还可能会有其他的子节点,若直接把其删除,结果会出错. 这里就需要用到一个虚拟数组Trick,和Father数组合作,实现"删除"的目的(实际上该节点还是存在的).
代码:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAXN = 1000111*2;
int N,M;
int x,y;
int cnt,Case = 0,Ans;
int Trick[MAXN],Father[MAXN],Hash[MAXN];
void Initial()
{
cnt = N;
Ans = 0;
for(int i = 0;i < MAXN;i++)//另开一个虚拟数组Trick,开始和Father储存一样的信息
Father[i] = Trick[i] = i,Hash[i] = 0;
}
int Find(int x)
{
if(x == Father[x])return x;
return Father[x] = Find(Father[x]);
}
void Union(int x,int y)
{
x =