zoukankan      html  css  js  c++  java
  • 洛谷 P1197 [JSOI2008]星球大战

    很好的并查集题,题面说的摧毁但仔细考虑便知可以倒着建造

    #include<cstdio>
    
    int n,m,t,sum,cnt,tot;
    int st[400010],fa[400010],head[400010],lian[400010],ans[400010];
    bool flag[400010];
    
    struct edg{
        int to,next,from;
    }edge[400010];
    
    void add(int x,int y){
        edge[++cnt].to=y;
        edge[cnt].from=x;
        edge[cnt].next=head[x];
        head[x]=cnt;
    }
    
    int find(int x){
        return fa[x]==x?x:fa[x]=find(fa[x]);
    }
    
    int main(){
        scanf("%d %d",&n,&m);
        for(int i=1;i<=m;i++){
            int a,b;
            scanf("%d %d",&a,&b);
            add(a,b);
            add(b,a);
        }
        scanf("%d",&t);
        for(register int i=1;i<=t;i++) {
            scanf("%d",&st[i]);
            flag[st[i]]=true;
        }
        for(register int i=0;i<n;i++) fa[i]=i;
        int tot=n-t;
        for(int i=1;i<=cnt;i++){
            int u=find(edge[i].to),v=find(edge[i].from);
            if(u!=v&&!flag[edge[i].to]&&!flag[edge[i].from]) tot--,fa[u]=v;
        }
        ans[t+1]=tot;
        for(int i=t;i;i--){
            int x=st[i];
            tot++,flag[x]=false;
            for(int j=head[x];j;j=edge[j].next){
                int u=find(x),v=find(edge[j].to);
                if(!flag[edge[j].to]&&u!=v) tot--,fa[v]=u;
            }
            ans[i]=tot;
        }
        for(int i=1;i<=t+1;i++) printf("%d
    ",ans[i]);
        return 0;
    }
    版权声明:本文为博主原创文章,未经博主允许不得转载。 博主:https://www.cnblogs.com/Menteur-Hxy/
  • 相关阅读:
    Scite 中文支持
    【线段上】简单贪心总结……未完
    Happy new year!
    poj 2960 SNim
    【转】SG函数资料(入门必备)
    poj 2478 Farey Sequence
    Poj 3083 Children of the Candy Corn
    Poj 1077 Eight 八数码
    Poj 1830 开关问题:高斯消元
    关于poj 放苹果
  • 原文地址:https://www.cnblogs.com/Menteur-Hxy/p/9248052.html
Copyright © 2011-2022 走看看