40pts求助
查看原帖
40pts求助
1019873
blue7628_N2O楼主2025/2/6 11:38
#include<bits/stdc++.h>
using namespace std;
const int MAXN=400010;
vector<int> adj[MAXN]; //邻接表
int n,m,x,y,k,father[MAXN],B[MAXN],tot,ans[MAXN];
bool b[MAXN];
int find(int k) {
	if(father[k]==k)return k;
	else return father[k]=find(father[k]);
}
void Adjacency_List_storage(int v,int u) {
	adj[u].push_back(v);
	adj[v].push_back(u);
}
void union_find_merge(int v,int u) {
//	cout<<"merge:"<<v<<" and "<<u<<endl;
	v=find(v),u=find(u);
	if(v==u)return;
	else {
		father[v]=u;
		tot--;
//		cout<<"A and B are merged,tot="<<tot<<endl;
	}
}
int main() {
	scanf("%d%d",&n,&m);
	for(int i=0; i<n; i++) {
		father[i]=i;
	}
	for(int i=1; i<=m; i++) {
		scanf("%d%d",&x,&y);
		Adjacency_List_storage(x,y);
	}
	scanf("%d",&k);
	tot=n-k;
//	cout<<"_______"<<endl;
	ans[k+1]=tot;
	for(int i=1; i<=k; i++) {
		scanf("%d",&B[i]);
		b[B[i]]=true;
	}
//	for(int i=0; i<n; i++) {
//		cout<<"now:"<<i<<endl;
//		for(int j=0; j<adj[i].size(); j++) {
//			cout<<adj[i][j]<<" ";
//		}
//		cout<<endl;
//	}
//	for(int i=0; i<n; i++) {
//		cout<<"b["<<i<<"]="<<b[i]<<endl;
//	}
	for(int i=0; i<n; i++) {
		if(b[i]==false)
			for(int j=0; j<adj[i].size(); j++) {
				if(b[adj[i][j]]==false)
					union_find_merge(i,adj[i][j]);
			}
	}
//	for(int i=0; i<n; i++) {
//		cout<<"father["<<i<<"]="<<father[i]<<endl;
//	}
	for(int i=k; i>=1; i--) {
//		for(int j=1; j<=k+1; j++) {
//			printf("ans[%d]=%d\n",j,ans[j]);
//		}
		tot++;
		b[B[i]]=false;
		for(int j=0; j<adj[B[i]].size(); j++) {
			if(b[adj[B[i]][j]]==false)union_find_merge(B[i],adj[B[i]][j]);
		}
		ans[i]=tot;
	}
	for(int i=1; i<=k+1; i++) {
		printf("%d\n",ans[i]);
	}
	return 0;
}

WA on #4~#9 求助!

2025/2/6 11:38
加载中...