[HDOJ2473]Junk-Mail Filter(并查集,删除操作,马甲)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2473

给两个操作:
M X Y:将X和Y看成一类。

S X:将X单独划归成一类。

最后问的是有多少类。

并查集,但是带有删除操作。然而并查集本身不支持删除,网上说可以引入一个id来表示一个点。就好像一个人上网有很多小号一样,假如这个人的小号被封掉并且永久不能解封,还想继续玩下去的话那就重新建一个号,再生成一个id,表示这个id是这个人就好了。

注意在删除操作的时候不能把原来id的pre值重置。

 /*
━━━━━┒ギリギリ♂ eye!
┓┏┓┏┓┃キリキリ♂ mind!
┛┗┛┗┛┃\○/
┓┏┓┏┓┃ /
┛┗┛┗┛┃ノ)
┓┏┓┏┓┃
┛┗┛┗┛┃
┓┏┓┏┓┃
┛┗┛┗┛┃
┓┏┓┏┓┃
┛┗┛┗┛┃
┓┏┓┏┓┃
┃┃┃┃┃┃
┻┻┻┻┻┻
*/
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cstring>
#include <climits>
#include <complex>
#include <fstream>
#include <cassert>
#include <cstdio>
#include <bitset>
#include <vector>
#include <deque>
#include <queue>
#include <stack>
#include <ctime>
#include <set>
#include <map>
#include <cmath>
using namespace std;
#define fr first
#define sc second
#define cl clear
#define BUG puts("here!!!")
#define W(a) while(a--)
#define pb(a) push_back(a)
#define Rint(a) scanf("%d", &a)
#define Rll(a) scanf("%lld", &a)
#define Rs(a) scanf("%s", a)
#define Cin(a) cin >> a
#define FRead() freopen("in", "r", stdin)
#define FWrite() freopen("out", "w", stdout)
#define Rep(i, len) for(int i = 0; i < (len); i++)
#define For(i, a, len) for(int i = (a); i < (len); i++)
#define Cls(a) memset((a), 0, sizeof(a))
#define Clr(a, x) memset((a), (x), sizeof(a))
#define Full(a) memset((a), 0x7f7f, sizeof(a))
#define lrt rt << 1
#define rrt rt << 1 | 1
#define pi 3.14159265359
#define RT return
#define lowbit(x) x & (-x)
#define onenum(x) __builtin_popcount(x)
typedef long long LL;
typedef long double LD;
typedef unsigned long long ULL;
typedef pair<int, int> pii;
typedef pair<string, int> psi;
typedef map<string, int> msi;
typedef vector<int> vi;
typedef vector<LL> vl;
typedef vector<vl> vvl;
typedef vector<bool> vb; const int maxn = ;
int pre[maxn];
int id[maxn];
int sum[maxn];
int n, m;
int cnt, t; int find(int x) {
RT x == pre[x] ? x : pre[x] = find(pre[x]);
} void unite(int x, int y) {
x = find(x);
y = find(y);
if(x != y) pre[y] = x;
} int main() {
// FRead();
char cmd[];
int a, b, _ = ;
while(~Rint(n) && ~Rint(m) && n + m) {
cnt = n + ; Cls(sum);
Rep(i, maxn) id[i] = i, pre[i] = i;
W(m) {
Rs(cmd);
if(cmd[] == 'M') {
Rint(a); Rint(b);
unite(id[a], id[b]);
}
if(cmd[] == 'S') {
Rint(a);
id[a] = cnt++;
}
}
Rep(i, n) sum[i] = find(id[i]);
sort(sum, sum+n); t = unique(sum, sum+n) - sum;
printf("Case #%d: %d\n", _++, t);
}
RT ;
}
上一篇:数据结构和算法(Golang实现)(25)排序算法-快速排序


下一篇:explicit关键字