题目链接:
题目解析:
离线以后逆序操作
AC代码:
#include<iostream>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
const int MAXN=200005;
int n,m,fa[MAXN*2],k,vis[MAXN*2],ans[2*MAXN],num;
struct plant
{
int x,y,c;
bool operator <(const plant b)const{return c<b.c;}
}a[MAXN];
bool mycmp(plant x,plant y)
{
return x.c<y.c;
}
int getfa(int x){return fa[x]==x?x:fa[x]=getfa(fa[x]);}
void mer(int x,int y){
int fx=getfa(x),fy=getfa(y);
if(fx!=fy) fa[fx]=fy,num--;
}
int main()
{
cin>>n>>m;
num=n;
for(int i=0;i<n;i++) fa[i]=i;
for(int i=1;i<=m;i++)
{
cin>>a[i].x>>a[i].y;
a[i].c=0;
}
cin>>k;
int temp;
for(int i=1;i<=k;i++)
{
cin>>temp;
vis[temp]=k-i+1;
}
for(int i=1;i<=m;i++) a[i].c=max(vis[a[i].x],vis[a[i].y]);
sort(a+1,a+1+m);
for(int i=0,j=1;i<=k;i++)
{
for(;a[j].c==i;j++) mer(a[j].x,a[j].y);
ans[i]=num-(k-i);
}
for(int i=k;i>=0;i--) cout<<ans[i]<<endl;;
return 0;
}