只A #2 #3剩下全WA求助
查看原帖
只A #2 #3剩下全WA求助
239832
sipu6174楼主2020/6/2 21:30
#include<bits/stdc++.h>
using namespace std;
const int N=4e5+10;
int n,m,q,ans,sol[N],p;
vector<int>v[N];
int br[N],fa[N];
bool used[N];//0是已经加了的,1是未加的。
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
int main(){
   ios::sync_with_stdio(0);
   cin>>n>>m;
   for(int i=1;i<=m;i++){
      int x,y;cin>>x>>y;
      v[x].push_back(y),v[y].push_back(x);
   }for(int i=0;i<n;i++) fa[i]=i;
   ans=n;cin>>q;
   for(int i=q;i;i--) //倒着连边
      {cin>>br[i];if(!used[br[i]])used[br[i]]=1,ans--;}//剩下的点数
   for(int i=0;i<n;i++)
      if(!used[i]) for(int j=0;j<v[i].size();j++){
         int x=i,y=v[x][j];
         if(used[y]) continue;
         if(find(fa[x])!=find(fa[y])) fa[fa[x]]=fa[y],ans--;
      }//剩下的连通块
   sol[++p]=ans;
   for(int i=1;i<=q;i++){
      used[br[i]]=0,ans++;
      for(int j=0;j<v[br[i]].size();j++){
         int x=br[i],y=v[x][j];
         if(used[y]) continue;
         if(find(fa[x])!=find(fa[y])) fa[fa[x]]=fa[y],ans--;//开始加边
      }
      sol[++p]=ans;
   }
   for(int i=p;i;i--) cout<<sol[i]<<endl;//再倒回来
   return 0;
}
2020/6/2 21:30
加载中...