思路:并查集应用,处理是倒过来处理。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int father[10005], a[100005], b[100005], block[100005];
int find(int x)
{
return x == father[x] ? x : father[x] = find(father[x]);
}
void unit(int x, int y)
{
int a = find(x);
int b = find(y);
father[a] = father[b];
return ;
}
int main(int argc, char const *argv[])
{
int n, m;
//freopen("in.c", "r", stdin);
while(~scanf("%d%d", &n, &m))
{
memset(block, 0, sizeof(block));
for(int i = 0; i < n; i ++)
father[i] = i;
for(int i = 0; i < m; i ++)
scanf("%d%d", &a[i], &b[i]);
for(int i = m-1; i >= 0; i --)
{
block[i] = n;
if(find(a[i]) != find(b[i]))
{
n--;
unit(a[i], b[i]);
}
}
for(int i = 0;i < m; i ++)
printf("%d\n", block[i]);
}
return 0;
}