博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 1016 星球大战starwar(逆向-并查集)
阅读量:6821 次
发布时间:2019-06-26

本文共 760 字,大约阅读时间需要 2 分钟。

题目链接:

题意:给出一个图。每次删掉一个点,求删掉之后连通块个数。

思路:正着做不好做,我们反正想,那么题目就变成每次添加一个点(其实就是添加若干条边)之后连通块个数。这就可以使用并查集了。。 

vector<int> g[N];
int n,m,Q,a[N],s[N],sz[N],h[N],ans[N];
int find(int x)
{
    if(s[x]!=x) s[x]=find(s[x]);
    return s[x];
}
int sum;
void Union(int x,int y)
{
    x=find(x);
    y=find(y);
    if(x!=y)
    {
        sum--;
        if(sz[x]<sz[y])
        {
            sz[y]+=sz[x];
            s[x]=y;
        }
        else
        {
            sz[x]+=sz[y];
            s[y]=x;
        }
    }
}
int main()
{
    RD(n,m);
    int i,j,k,u,v;
    FOR1(i,m)
    {
        RD(u,v);
        g[u].pb(v),g[v].pb(u);
    }
    FOR0(i,n) s[i]=i,sz[i]=1;
    RD(Q);
    FOR1(i,Q) RD(a[i]),h[a[i]]=1;
    sum=n;
    FOR0(i,n) if(!h[i]) FOR0(j,SZ(g[i])) if(!h[g[i][j]])
    {
        Union(i,g[i][j]);
    }
    int x=Q;
    FORL1(i,Q)
    {
        ans[i]=sum-x;
        x--;
        h[a[i]]=0;
        FOR0(j,SZ(g[a[i]])) if(!h[g[a[i]][j]])
        {
            Union(a[i],g[a[i]][j]);
        }
    }
    PR(sum);
    FOR1(i,Q) PR(ans[i]);
    return 0;
}

转载地址:http://osozl.baihongyu.com/

你可能感兴趣的文章
js笔试题2
查看>>
Custom TabBarController
查看>>
MKSocialShareTableViewCell
查看>>
AngleGradientLayer
查看>>
用Myeclipse创建PhoneGap应用程序
查看>>
开源 java CMS - FreeCMS2.8 站内信
查看>>
kubeadm初始化kubernetes cluster的一点经验
查看>>
ZooKeeper应用案例
查看>>
springboot(二):thymeleaf模板开发
查看>>
Android Bluetooth HID实现详解
查看>>
高通camera架构
查看>>
PHP运行模式
查看>>
leetcode Remove Duplicates from Sorted Array
查看>>
spring cloud 与dubbo
查看>>
Linux零拷贝函数SendFile应用
查看>>
linux下创建文件或文件夹快捷方式一个简单地方法
查看>>
SDPhotoBrowser图片浏览器
查看>>
php 使用DOMDocument 解析xml
查看>>
如何7步实现根据源码包创建rpm包
查看>>
hadoop2.0集群搭建详解
查看>>