码迷,mamicode.com
首页 > Web开发 > 详细

bzoj 1015 [JSOI2008]星球大战starwar

时间:2017-08-17 12:50:34      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:include   个数   log   namespace   并查集   逆向   arw   size   space   

逆向考虑,先看作所有星球都被摧毁,然后恢复星球。

连通块个数用并查集维护,每次恢复不能算被毁掉的星球

#include<cstdio>
#include<vector>
using namespace std;
int n,m,k,fa[400001],x,y;
vector<int> G[400001];
int ans[400001];
bool d[400001];
int v[400001];
bool vis[400001];
int gf(int x){
    if(fa[x]==x) return x;
    return fa[x]=gf(fa[x]);
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++) fa[i]=i;
    for(int i=1;i<=m;i++){
        scanf("%d%d",&x,&y);
        G[x].push_back(y);
        G[y].push_back(x);
    }
    scanf("%d",&k);
    int now=n;
    for(int i=1;i<=k;i++){
        scanf("%d",&v[i]);
        d[v[i]]=1;
    }
    for(int i=0;i<n;i++){
        if(!d[i]){
            vis[i]=1;
            for(int j=0;j<G[i].size();j++){
                if(gf(i)!=gf(G[i][j])&&!d[G[i][j]]){
                    now--;
                    fa[gf(G[i][j])]=gf(i);
                }
            }
        }
    }
    ans[k+1]=now-k;
    for(int i=k;i>=1;i--){
        ans[i]=ans[i+1]+1;vis[v[i]]=1;
        for(int j=0;j<G[v[i]].size();j++){
            if(gf(v[i])!=gf(G[v[i]][j])&&vis[G[v[i]][j]]){
                ans[i]--;
                fa[gf(G[v[i]][j])]=gf(v[i]);
            }
        }
    }
    for(int i=1;i<=k+1;i++)printf("%d\n",ans[i]);
    return 0;
}

 

bzoj 1015 [JSOI2008]星球大战starwar

标签:include   个数   log   namespace   并查集   逆向   arw   size   space   

原文地址:http://www.cnblogs.com/nzher/p/7380507.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!