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 = Find(x);
y = Find(y);
if(x != y)
Father[y] = x;
}
void Del

该博客介绍了如何利用虚拟数组和并查集解决HDU2473题目的邮件分类问题。在处理过程中,由于需要删除节点但又不能真的删除以防止影响后续节点,博主提出了一种技巧,通过虚拟数组配合Father数组来模拟删除操作,确保最终正确统计类别数量。
最低0.47元/天 解锁文章
11万+

被折叠的 条评论
为什么被折叠?



