现在的位置: 首页 > 综合 > 正文

1015: [JSOI2008]星球大战starwar

2018年04月24日 ⁄ 综合 ⁄ 共 945字 ⁄ 字号 评论关闭
#include<iostream>
#include<cstdio>
#define N 400001
using namespace std;
int n,m,d,cnt,tot;
int fa[N],q[N],head[N],ans[N];
bool used[N],del[N];
struct edge{
	int to,next;
}e[N];
inline int find(int x){
	return fa[x]==x?x:fa[x]=find(fa[x]);
}
void insert(int u,int v){
	e[++cnt]=(edge){v,head[u]};head[u]=cnt;
	e[++cnt]=(edge){u,head[v]};head[v]=cnt;
}
void ins(int x){
	int p=find(x),q;
	for(int i=head[x];i;i=e[i].next){
		if(used[e[i].to]){
			q=find(e[i].to);
			if(p!=q)fa[q]=p,tot--;
		}
	}
}
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-'0';ch=getchar();}        
    return x*f;        
} 
int main(){
	n=read();m=read();
	for(int i=0;i<n;i++)fa[i]=i;
	for(int i=1;i<=m;i++){
		int x=read(),y=read();
		insert(x,y);
	}
	d=read();
	for(int i=1;i<=d;i++){
		q[i]=read();
		del[q[i]]=1;
	}
	for(int i=0;i<n;i++){
		if(!del[i]){
			tot++;
			ins(i);
			used[i]=1;
		}
	}
	ans[d+1]=tot;
	for(int i=d;i>=1;i--){
		tot++;
		ins(q[i]);
		used[q[i]]=1;
		ans[i]=tot;
	}
	for(int i=1;i<=d+1;i++)
		printf("%d\n",ans[i]);
	return 0;
}

抱歉!评论已关闭.