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
",ans[i]);
  return 0;
}
View Code
原文地址:https://www.cnblogs.com/new-hand/p/12mango.html