社区讨论

40分求助

P1197[JSOI2008] 星球大战参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lo89lilu
此快照首次捕获于
2023/10/27 15:01
2 年前
此快照最后确认于
2023/10/27 15:01
2 年前
查看原帖
AC1,2,3,10AC1,2,3,10 其余wa
CPP
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
#include<queue>
#include<cmath>
#include<map>

const int maxn=4e5+5;

using namespace std;

int n,m,k,t,ans,tp;
int fa[maxn],a[maxn],fin[maxn],stk[maxn];
bool vis[maxn],sam[maxn];
vector<int>g[maxn];

int find(int x) {
	if(x==fa[x])
		return x;
	return fa[x]=find(fa[x]);
}
void unit(int x,int y) {
	int xx=find(x),yy=find(y);
	if(xx==yy)
		return ;
	fa[xx]=yy;
}
void cle() {
	for(int i=1; i<=tp; i++)
		sam[stk[i]]=0;
	tp=0;
}
int main() {
	//freopen("P1197myzao.in","r",stdin);
	scanf("%d%d",&n,&m);
	for(int i=0; i<=n-1; i++)
		fa[i]=i;
	for(int i=1,u,v; i<=m; i++) {
		scanf("%d%d",&u,&v);
		g[u].push_back(v);
		g[v].push_back(u);
	}
	scanf("%d",&k);
	for(int i=1,x; i<=k; i++) {
		scanf("%d",&x);
		vis[x]=1;
		a[++t]=x;
	}
	for(int i=0; i<=n-1; i++) {
		if(!vis[i]) {
			for(int j=0; j<g[i].size(); j++) {
				if(vis[g[i][j]])continue;
				int ff=find(g[i][j]);
				unit(i,g[i][j]);
				if(sam[ff]==0) {
					sam[ff]=1;
					stk[++tp]=ff;
				}
			}
			ans-=(tp-1);
			cle();
		}
	}
	//printf("ans: %d\n",ans);
	for(int i=t; i>=1; i--) {
		fin[i]=ans;
		//printf("%d\n",ans);
		vis[a[i]]=0;
		for(int j=0; j<g[a[i]].size(); j++) {
			if(vis[g[a[i]][j]])continue;
			int ff=find(g[a[i]][j]);
			if(sam[ff]==0) {
				sam[ff]=1;
				stk[++tp]=ff;
			}
			unit(a[i],g[a[i]][j]);
		}
		ans-=(tp-1);
		cle();
	}
	printf("%d\n",ans);
	for(int i=1; i<=t; i++)
		printf("%d\n",fin[i]);
	return 0;
}


回复

1 条回复,欢迎继续交流。

正在加载回复...