传递闭包学习

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

简单来说

若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}$

你可能感兴趣的:(传递闭包学习)