• 传递闭包学习


    在交际网络中,给定若干个元素和若干对二元关系,且关系具有传递性。通过传递性推导出尽可能多的元素之间的关系叫做传递闭包。

    简单来说

    若1与2连通,2与3连通。那么1与3连通。这样推导的过程就叫做传递闭包。

    简单的代码实现

    可以用弗洛伊德实现,这样是$n^3$的

    例题

    bzoj2208

    2208: [Jsoi2010]连通数

    Time Limit: 20 Sec  Memory Limit: 512 MB
    Submit: 4758  Solved: 2026
    [Submit][Status][Discuss]

    Description

    求每个点能到达的顶点数

    Input

    输入数据第一行是图顶点的数量,一个正整数N。 接下来N行,每行N个字符。第i行第j列的1表示顶点i到j有边,0则表示无边。

    Output

    输出一行一个整数,表示该图的连通数。

    Sample Input

    3
    010
    001
    100

    Sample Output

    9

    HINT

    对于100%的数据,N不超过2000。

    我们可以传递闭包但$n^3$肯定会超时怎么办呢?

    我们可以用bitset优化

        for(ll j=1;j<=n;j++)
            for(ll i=1;i<=n;i++)
            if(w[i][j])
                w[i]|=w[j];

    首先如果i与j连通,那么所有j能到达的点i都能够到达

    |就完了 j为阶段数,所以j要放在i外面

    我们巧妙省掉一层循环。使变为$frac{n^3}{32}$

    我已没有下降的余地
  • 相关阅读:
    Java CompletableFuture:allOf等待所有异步线程任务结束
    多线程分批处理数据
    ListSplitUtil (批量数据处理)
    mysql性能优化相关
    JsonUtil
    批量数据数据处理
    多集合取交集公用方法
    ALSA:Linux下声卡编程
    word
    安卓使用自己导入的db3数据库文件
  • 原文地址:https://www.cnblogs.com/znsbc-13/p/11182983.html
Copyright © 2020-2023  润新知