在交际网络中,给定若干个元素和若干对二元关系,且关系具有传递性。通过传递性推导出尽可能多的元素之间的关系叫做传递闭包。
简单来说
若1与2连通,2与3连通。那么1与3连通。这样推导的过程就叫做传递闭包。
简单的代码实现
可以用弗洛伊德实现,这样是$n^3$的
例题
bzoj2208
2208: [Jsoi2010]连通数
Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 4758 Solved: 2026
[Submit][Status][Discuss]
Description
Input
输入数据第一行是图顶点的数量,一个正整数N。 接下来N行,每行N个字符。第i行第j列的1表示顶点i到j有边,0则表示无边。
Output
输出一行一个整数,表示该图的连通数。
Sample Input
3
010
001
100
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}$