蒟蒻求助(悬赏关注)
查看原帖
蒟蒻求助(悬赏关注)
699271
gaojizhe05楼主2024/7/4 19:00
#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+7;
int n,m,a,b,k,f[maxn],fa[maxn],ans[maxn],cnt,t[maxn];
vector <int> e[maxn];
bool vis[maxn],isf[maxn],tag_fa[maxn];
bool con;
int find(int x){
	if(fa[x]==x) return x;
	return fa[x]=find(fa[x]);
}
void merge(int x,int y){
	int fx=find(x),fy=find(y);
	if(fx!=fy){
	    fa[fx]=fy;
	    if(con) cnt--;
	    else con=1;
	}
}
void dfs(int u,int v){
	if(vis[u]||isf[u]) return;
	vis[u]=1;
	fa[u]=v;
	for(int i=0;i<e[u].size();i++) dfs(e[u][i],u);
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		scanf("%d%d",&a,&b);
		e[a].push_back(b);
		e[b].push_back(a);
	}
	scanf("%d",&k);
	for(int i=1;i<=k;i++){
		scanf("%d",&f[i]);
		isf[f[i]]=1,t[f[i]]=i;
	}
	for(int i=1;i<=n;i++) fa[i]=i;
	for(int i=1;i<=n;i++) dfs(i,i);	
	for(int i=1;i<=n;i++)
	    if(!tag_fa[fa[i]]) tag_fa[fa[i]]=1,cnt++;
	cnt-=k;
	ans[k+1]=cnt;
	for(int i=k;i>=1;i--){
		con=0;
		for(int j=0;j<e[f[i]].size();j++) 
		    if(!(isf[e[f[i]][j]]&&t[e[f[i]][j]]<i)) merge(f[i],e[f[i]][j]);
		ans[i]=cnt;	    
	}
	for(int i=1;i<=k+1;i++) printf("%d\n",ans[i]);
	return 0;
} 
2024/7/4 19:00
加载中...