10pts 求调
查看原帖
10pts 求调
728840
covonant楼主2025/1/30 20:41
#include<iostream>
#include<vector>
using namespace std;
int n,m,k;
struct edge{
	int from,to;
}eg[400005];
int aim[400005];
int fa[400005],vis[400005];
int ans[400005];
vector<int> v[400005];
int find(int x){
	if(fa[x]==x) return x;
	else return fa[x]=find(fa[x]);
}
void join(int x,int y){
	int t=find(x),k=find(y);
	if(t!=k) fa[t]=k;
}
bool check(int x,int y){
	int t=find(x),k=find(y);
	return t==k;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		fa[i]=i;
	}
	for(int i=1;i<=m;i++){
		cin>>eg[i].from>>eg[i].to;
		eg[i].from++;eg[i].to++;	
		v[eg[i].from].push_back(eg[i].to);
		v[eg[i].to].push_back(eg[i].from);
	}
	cin>>k;
	for(int i=1;i<=k;i++){
		cin>>aim[i];
		aim[i]++;
		vis[aim[i]]=1;
	}
	//add
	for(int i=1;i<=m;i++){
		int u=eg[i].from,v=eg[i].to;
		if(!vis[u]&&!vis[v]){
			join(u,v);
		}
	}
	int tot=0;
	for(int i=1;i<=n;i++){
		if(fa[i]==i&&!vis[i]){
			tot++;
		}
	}
	ans[k+1]=tot;
	for(int i=k;i>=1;i--){
		vis[aim[i]]=0;
		for(int j=0;j<v[aim[i]].size();j++){
			if(!vis[v[aim[i]][j]]){				
				if(fa[aim[i]]!=aim[i]&&!check(aim[i],v[aim[i]][j])) tot--;
				join(aim[i],v[aim[i]][j]);
			}
		}
		ans[i]=tot;
	}
	for(int i=1;i<=k+1;i++){
		cout<<ans[i]<<"\n";
	}
	return 0;
} 
2025/1/30 20:41
加载中...