bzoj 1015: [JSOI2008]星球大战starwar 并查集+离线处理

来源:互联网 发布:百乐钢笔淘宝哪家 编辑:程序博客网 时间:2024/04/27 16:10

代码:

#include<iostream>#include<cstdio>#include<cstdlib>#define inf 0x7fffffffusing namespace std;int n,m,cnt,q,last[400001],ans[400001],f[400001],a[400001],v[400001];struct data{int u,v,next;}e[400005];void insert(int u,int v){cnt++;e[cnt].u=u;e[cnt].v=v;e[cnt].next=last[u];last[u]=cnt;cnt++;e[cnt].u=v;e[cnt].v=u;e[cnt].next=last[v];last[v]=cnt;}int find(int x){if (f[x]==x) return x;f[x]=find(f[x]);return f[x];}int main(){scanf("%d%d",&n,&m);for (int i=1;i<=m;i++){int u,v;scanf("%d%d",&u,&v);insert(u,v);}scanf("%d",&q);for (int i=1;i<=q;i++){scanf("%d",&a[i]);v[a[i]]=1;}for (int i=0;i<n;i++) f[i]=i;int sum=n-q;for (int i=0;i<n;i++)if (!v[i]){int j=last[i];while (j){if (!v[e[j].u]&&!v[e[j].v]&&find(e[j].u)!=find(e[j].v)){sum--;f[find(e[j].u)]=find(e[j].v);}j=e[j].next;}}for (int i=q;i>=1;i--){ans[i]=sum;sum++;int j=last[a[i]];v[a[i]]=0;while (j){if (!v[e[j].u]&&!v[e[j].v]&&find(e[j].u)!=find(e[j].v)){sum--;f[find(e[j].u)]=find(e[j].v);}j=e[j].next;}}printf("%d\n",sum);for (int i=1;i<=q;i++) printf("%d\n",ans[i]);return 0;}


0 0
原创粉丝点击