bzoj1015
倒着做,正着做是要GG的,每次将删的点加进去,反着存。代码能力太差了,改了好久,最后请教大佬发现智障问题
#include <stdio.h> #include <algorithm> #include <cstring> #include <cmath> #include <queue> #include <vector> using namespace std; const int maxn=400000+10; const int maxm=200000+10; struct hh { int v,next; }e[maxn]; int n,m,k,point,tot; int q[maxn],head[maxn],fa[maxn],vis[maxn],del[maxn],ans[maxn]; template <class T> void read(T&x) { x=0;char c=getchar();int f=0; while(c<'0'||c>'9'){f|=(c=='-');c=getchar();} while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+(c^=48),c=getchar(); x=f?-x:x; } int find(int v){return fa[v]==v?v:fa[v]=find(fa[v]);} void add(int u,int v){e[++point].v=v;e[point].next=head[u];head[u]=point;} void add2(int x) { int i=head[x],q=find(x),p; while(i!=-1) { if(vis[e[i].v]) { p=find(e[i].v); if(q!=p)fa[p]=q,tot--; } i=e[i].next; } } int main() { memset(head,-1,sizeof(head)); read(n);read(m); for(int i=0;i<n;i++)fa[i]=i; int u,v; for(int i=1;i<=m;i++) { read(u);read(v); add(u,v);add(v,u); } read(k); for(int i=1;i<=k;i++) { read(q[i]); del[q[i]]=1; } for(int i=0;i<n;i++) { if(!del[i]) { tot++; add2(i); vis[i]=1; } } ans[k+1]=tot; for(int i=k;i>0;i--) { tot++; add2(q[i]); vis[q[i]]=1; ans[i]=tot; } for(int i=1;i<=k+1;i++)printf("%d\n",ans[i]); return 0; }