题意:
一个图去掉几条边,问还剩多少个连通块。
解法:
倒着做并查集,或者正着做bfs也可以。
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
#define maxn 10005
#define maxm 100005
int n, m;
int f[maxn];
int ans[maxm], s[maxm], t[maxm];
int find(int x)
{
if (f[x]==x) return f[x];
f[x]=find(f[x]);
return f[x];
}
int main()
{
while (scanf("%d%d",&n,&m)!=-1)
{
for (int i=0;i<n;i++)
f[i]=i;
for (int i=0;i<m;i++)
scanf("%d%d",&s[i],&t[i]);
int num=n;
for (int i=m-1;i>=1;i--)
{
int u=find(s[i]);
int v=find(t[i]);
if (u!=v)
num--, f[u]=v;
ans[i]=num;
}
ans[m]=n;
for (int i=1;i<=m;i++)
printf("%d\n",ans[i]);
}
return 0;
}