xqqQwQ_ @ 2021-10-29 22:54:58
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1000001;
int head[MAXN],ver[MAXN],pre[MAXN];
int cnt=1;
int n,m;
bool br[MAXN],vis[MAXN];
int del[MAXN];
int fa[MAXN];
int ans[MAXN];
void add_edge(int u,int v)
{
pre[cnt]=head[u];
head[u]=cnt;
ver[cnt]=v;
cnt++;
}
void init()
{
for(int i=0;i<n;i++) fa[i]=i;
}
int findn(int x)
{
if(fa[x]==x) return x;
else return fa[x]=findn(fa[x]);
}
void merge(int x,int y)
{
int fx=findn(x),fy=findn(y);
fa[fx]=fy;
return;
}
void bfs(int ah)
{
int st=0;
int cnt=ah;
while(cnt>0)
{
queue<int> q;
if(vis[st]||br[st])
{
st++;
continue;
}
vis[st]=1;
cnt--;
for(int i=head[st];i;i=pre[i])
{
if(br[ver[i]]||vis[ver[i]]) continue;
q.push(ver[i]);
merge(ver[i],st);
}
while(!q.empty())
{
int x=q.front();
q.pop();
if(vis[x]||br[x]) continue;
cnt--;
for(int i=head[x];i;i=pre[i])
{
if(vis[ver[i]]||br[ver[i]]) continue;
q.push(ver[i]);
merge(x,ver[i]);
}
}
st++;
}
return;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
add_edge(x,y);
add_edge(y,x);
}
int k;
cin>>k;
init();
for(int i=1;i<=k;i++)
{
cin>>del[i];
br[del[i]]=1;
}
bfs(n-k);
int cnt=0;
for(int i=0;i<n;i++) if(fa[i]==i&&br[i]!=1) cnt++;
ans[k]=cnt;
for(int i=k;i>=1;i--)
{
int a=del[i];
br[del[i]]=0;
cnt++;
for(int j=head[a];j;j=pre[j])
{
if(br[ver[j]]) continue;
int fj=findn(ver[j]);
if(fj!=findn(a)) cnt--;
merge(a,ver[j]);
}
ans[i-1]=cnt;
}
for(int i=0;i<=k;i++) cout<<ans[i]<<endl;
return 0;
}
这个复杂度没错吧
by Ztemily @ 2021-10-29 22:55:50
快读,请
by xqqQwQ_ @ 2021-10-29 23:02:48
@Ztemily 不是吧,貌似是我bfs写假了