50分
查看原帖
50分
1069816
Tsuki091117楼主2024/3/29 19:12
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=4e5+10;
int n,m,x,y,k,ans,cnt,res[N],f[N],q[N];
int att[N];//attack攻击 
vector<int> v[N];
int find(int x){
	return f[x]==x?x:f[x]=find(f[x]);
}
int merge(int x,int y){
	int fx=find(x),fy=find(y);
	if(fx==fy){
		return 0;
	}
	f[fx]=fy;
	return 1;
}
signed main(){
	cin.tie(0);
	ios::sync_with_stdio(0);
	cin>>n>>m;
	for(int i=0;i<n;i++){
		f[i]=i;
	}
	for(int i=1;i<=n;i++){
		cin>>x>>y;
		v[x].push_back(y);
		v[y].push_back(x);
	}
	cin>>k;
	for(int i=1;i<=k;i++){
		cin>>att[i];
		q[att[i]]=1;
	}
	for(int i=0;i<n;i++){
		for(int j=0;j<v[i].size();j++){
			if(q[i]==1||q[v[i][j]]==1){
				continue;
			}
			merge(i,v[i][j]);
		}
	}
	for(int i=0;i<n;i++){
		if(f[i]==i&&!q[i]){
			ans++;
		}
	}
	res[1]=ans;
	cnt=1;
	for(int i=k;i>=1;i--){
		x=att[i];
		q[x]=0;
		ans++;
		for(int j=0;j<v[x].size();j++){
			y=v[x][j];
			if(!q[y]){
				ans-=merge(x,y);
			}
		}
		cnt++;
		res[cnt]=ans;
	}
	for(int i=cnt;i>=1;i--){
		cout<<res[i]<<"\n";
	}
	return 0;
}
2024/3/29 19:12
加载中...