并查集水题,倒序进行即可。很久没写并查集了,写的极挫。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define N 100005
int r[N][2];
int d[N];
int par[N];
int a[N];
int sum[N];
int n,m;
int Find(int rt)
{
if(par[rt]==rt)return rt;
return par[rt]=Find(par[rt]);
}
int uni(int x,int y)
{
int x0,y0;
x0=Find(x);
y0=Find(y);
if(x0>y0)
{
par[x0]=y0;
return 1;
}
else if(x0<y0)
{
par[y0]=x0;
return 1;
}
return 0;
}
int main()
{
scanf("%d%d",&n,&m);
int x,y;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&r[i][0],&r[i][1]);
}
int num;
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++)
par[i]=i;
scanf("%d",&num);
for(int i=1;i<=num;i++)
{
scanf("%d",&d[i]);
a[d[i]]=1;
}
for(int i=1;i<=m;i++)
{
if(a[i]!=1)
{
uni(r[i][0],r[i][1]);
}
}
memset(sum,0,sizeof(sum));
for(int i=1;i<=n;i++)
if(par[i]==i)sum[num]++;
for(int i=num;i>=1;i--)
{
sum[i-1]=sum[i]-uni(r[d[i]][0],r[d[i]][1]);
}
for(int i=1;i<=num;i++)
printf("%d ",sum[i]);
printf("\n");
return 0;
}