并查集WA悬3棺求条!(很急)
查看原帖
并查集WA悬3棺求条!(很急)
1300775
RC4010楼主2025/7/19 17:28
#include<bits/stdc++.h>
using namespace std;
const int N=4e5+1;
int d[2][N],vis[N],dead[N],fa[N],v[N];
int n,m;
vector<int>g[N];
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
int fd(int x){
	return fa[x]==x?x:fa[x]=fd(fa[x]);
}
void unity(int x,int y){
	fa[fd(x)]=fd(y);
}
int ltk(){
	int ans=0;
	memset(v,0,sizeof(v));
	for(int i=1;i<=n;i++){
		if (v[fd(i)]==0&&vis[i]==0){
			ans++;
			v[fd(i)]=1;
//			cout<<fd(i)<<endl;
		}
	}
	return ans;
}
stack<int>ans;
int main(){
    
    n=read(),m=read();
    for(int i=0;i<n;i++) fa[i]=i;
    for(int i=0;i<m;i++){
    	d[0][i]=read(),d[1][i]=read();
    	g[d[0][i]].push_back(d[1][i]);
    	g[d[1][i]].push_back(d[0][i]);
	}
	int k;
	k=read();
	for(int i=0;i<k;i++){
		dead[i]=read();
		vis[dead[i]]=1;
	}
	for(int i=0;i<m;i++){
		if (vis[d[0][i]]==0&&vis[d[1][i]]==0){
			unity(d[0][i],d[1][i]);
		}
	}
	int r=ltk();
	ans.push(r);
	for(int j=k-1;j>=0;j--){
		vis[dead[j]]=0;
//		sort(g[dead[j]].begin(),g[dead[j]].end());
        map<int,int>sb;
		int cnt=0;
        for(int i=0;i<g[dead[j]].size();i++){
			if (sb[fd(g[dead[j]][i])]==0) cnt++;
			sb[fd(g[dead[j]][i])]=1;
		}
		for(int i=0;i<g[dead[j]].size();i++){
			unity(dead[j],g[dead[j]][i]);
		}
	    if (g[dead[j]].size()){
	    	ans.push(r-cnt+1);
	    	r=r-cnt+1;
		}
	    else ans.push(r++);
	}
	while(ans.size()){
		cout<<ans.top()<<endl;
		ans.pop();
	}
}
2025/7/19 17:28
加载中...