[bzoj2208][Jsoi2010]连通数_bitset_传递闭包floyd

Posted JZYshuraK_彧

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[bzoj2208][Jsoi2010]连通数_bitset_传递闭包floyd相关的知识,希望对你有一定的参考价值。

连通数 bzoj-2208 Jsoi-2010

题目大意:给定一个n个节点的有向图,问每个节点可以到达的点的个数和。

注释:$1le nle 2000$。


想法:网上有好多tarjan+拓扑序dp的...

我们考虑暴力怎么做:显然就是用floyd的warshall求出连通矩阵,然后扫矩阵即可。

发现这个过程可以使用bitset进行优化,复杂度为$O(frac{n^3}{32})$。

最后,附上丑陋的代码... ...

#include <bits/stdc++.h>
using namespace std;
bitset<2010>bt[2010];
char s[2010][2010];
int main()
{
    int n; cin >> n ; for(int i=1;i<=n;i++) scanf("%s",s[i]+1); for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++) if(s[i][j]==‘1‘||i==j) bt[i][j]=true;
    }
    for(int j=1;j<=n;j++) for(int i=1;i<=n;i++) if(bt[i][j]) bt[i]|=bt[j];
    int ans=0; for(int i=1;i<=n;i++) ans+=bt[i].count(); printf("%d
",ans);
    return 0;
}

小结:有些时候看到二进制,而且复杂度并不优秀,考虑考虑bitset可能有奇效哦?!

技术分享图片

以上是关于[bzoj2208][Jsoi2010]连通数_bitset_传递闭包floyd的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ 2208[Jsoi2010]连通数

bzoj2208[Jsoi2010]连通数

bzoj 2208: [Jsoi2010]连通数

bzoj2208 [Jsoi2010]连通数

bzoj2208: [Jsoi2010]连通数(dfs)

BZOJ2208: [Jsoi2010]连通数