传递闭包学习

匿名 (未验证) 提交于 2019-12-02 23:48:02

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

简单来说

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

简单的代码实现

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

例题

bzoj2208

2208: [Jsoi2010]连通数

Memory Limit: 512 MB
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}$

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!