主要是设置虚点,如果某个点被删,并不真正的把他从集合中
删除,而是让他变成一个集合中没有的点,主要靠res数组
完成;
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 1e6+1e5+5;
int f[maxn], res[maxn], ans;
bool hash[maxn];
void init(int x)
{
for(int i = 0; i < x; i++)
f[i] = res[i] = i;
ans = x;
}
int find_fa(int x)
{
return f[x] == x ? x : f[x] = find_fa(f[x]);
}
void merge(int x, int y)
{
x = find_fa(x);
y = find_fa(y);
if(x != y) f[x] = y;
}
void aff(int x)
{
res[x] = ans;
f[ans] = ans;
ans++;
}
int main()
{
int n, m, k = 0;
while(scanf("%d%d", &n, &m),n||m)
{
init(n);
char s[5];
while(m--)
{
scanf("%s", s);
if(s[0] == 'M')
{
int u, v;
scanf("%d%d", &u, &v);
merge(res[u], res[v]);
}
else
{
int u;
scanf("%d", &u);
aff(u);
}
}
memset(hash, 0, sizeof(hash));
int cnt = 0;
for(int i = 0; i < n; i++)
{
int x = find_fa(res[i]);
if(!hash[x]) hash[x] = 1, cnt++;
}
printf("Case #%d: %d\n", ++k, cnt);
}
}
hdu2473
最新推荐文章于 2018-09-21 19:22:34 发布