zoukankan      html  css  js  c++  java
  • bzoj 1015 [JSOI2008]星球大战starwar

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

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

    #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;
    }
  • 相关阅读:
    JAVA中==与equals的区别
    spring面试重点
    struts2
    每个新手程序员必看的 SQL 指南
    QueryRunner的使用
    jquery GET POST
    jquery添加元素
    jquery 滑动动画
    jdbc 安装驱动
    为什么做java的web开发我们会使用struts2,springMVC和spring这样的框架?
  • 原文地址:https://www.cnblogs.com/nzher/p/7380507.html
Copyright © 2011-2022 走看看