0分求调
查看原帖
0分求调
1398557
congcong2012楼主2025/7/23 16:52
#include<bits/stdc++.h>
using namespace std;
const int N=400010;
struct E{
	int u,v;
};
int f[N],n,m,u,v,k,dd[N],ans[N],cnt;
bool d[N];
vector<int> g[N];
vector<E> e;

int find(int x){
	if(f[x]==x) return x;
	return f[x]=find(f[x]);
}
void merge(int x,int y){
	int a=find(x),b=find(y);
	if(a!=b) f[a]=b;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		cin>>u>>v;
		g[u].push_back(v);
		g[v].push_back(u);
		e.push_back((E){u,v});
	}
	for(int i=0;i<n;i++){
		f[i]=i;
	}
	cin>>k;
	for(int i=0;i<k;i++){
		cin>>dd[i];
		d[dd[i]]=1;
	}
	for(int i=0;i<n;i++){
		if(!d[i]) cnt++;
	}
	for(int i=0;i<m;i++){
		u=e[i].u;
		v=e[i].v;
		if(d[u]||d[v]) continue;
		if(find(u)!=find(v)){
			merge(u,v);
			cnt--;
		}
	}
	ans[k]=cnt;
	for(int i=k-1;i>=0;i--){
		int x=dd[i];
		d[x]=0;
		cnt++;
		for(int j=0;j<g[x].size();j++){
			if(d[g[x][j]]) continue;
			if(find(x)!=find(j)){
				merge(x,g[x][j]);
				cnt--;
			}
		}
		ans[i]=cnt;
	}
	for(int i=0;i<=k;i++){
		cout<<ans[i]<<'\n';
	}
	return 0;
}
2025/7/23 16:52
加载中...