求助
查看原帖
求助
461616
Judgelight楼主2022/10/26 22:11
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#define int long long
#define N 400009
#define M 400009
using namespace std;
int n,m,x,y,k,he[N],cnt,fa[N],vis[N],ans[N],distroy[N],jl[N],now,light[N],con;
int get(int x){
	return fa[x]==x?x:fa[x]=get(fa[x]);
}
struct Edge{
	int ne,to,flag;
}e[N];
void add(int u,int v){
	e[++cnt].ne=he[u];
	e[cnt].to=v;
	he[u]=cnt;
}
void dfs(int u){
	vis[u]=1;
	light[u]=1;
	for(int i=he[u];i;i=e[i].ne){
		int v=e[i].to;
		int fx=get(u),fy=get(v);
		fa[fx]=fy;
		if(vis[v]){
			continue;
		}
		dfs(v);
	}
}
inline void init(){
	for(int i=1;i<=n;i++){
		fa[i]=i;
	}
}
signed main(){
	cin>>n>>m;
	init();
	for(int i=1;i<=m;i++){
		cin>>x>>y;
		x++,y++;
		add(x,y);
		add(y,x);
	}
	cin>>k;
	for(int i=1;i<=k;i++){
		cin>>x;
		x++;
		distroy[i]=x;
		vis[x]=1;
		for(int j=he[x];j;j=e[j].ne){
			e[j].flag=1;
		}
	}
	for(int i=1;i<=n;i++){
		if(!vis[i]){
			con++;
			dfs(i);
		}
	}
	ans[k+1]=con;
	for(int i=k;i>=1;i--){
		int u=distroy[i];
		int flag=0;
		now=0;
		for(int j=he[u];j;j=e[j].ne){
			jl[++now]=e[j].to;
		}
		light[u]=1;
		for(int j=1;j<now;j++){
			int fx=get(jl[j]),fy=get(jl[j+1]);
			if(light[jl[j]]||light[jl[j+1]]){
				flag=1;
			}
			if(fx!=fy&&light[jl[j]]&&light[jl[j+1]]){
				con--;
			}
		}
		if(flag==0){
			con++;
		}
		for(int j=1;j<now;j++){
			int fx=get(jl[j]),fy=get(jl[j+1]);
			fa[fx]=fy;
		}
		for(int j=1;j<=now;j++){
			light[jl[j]]=1;
		}
		ans[i]=con;
	}
	for(int i=1;i<=k+1;i++){
		cout<<ans[i]<<endl;
	}
	return 0;
}
2022/10/26 22:11
加载中...