T了6个点

P1197 [JSOI2008] 星球大战

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写假了


|