Warshall算法

---用Warshall算法解决传递闭包问题

---在一个关系R中,如果任意的(a,b)和(b,c)在关系R中,则(a,c)也一定在关系R中,则称R是可传递的。一个关系R的传递闭包是包

含R的最小的传递关系。

---Warshall算法不用来计算最短路径,而是用来判断i和j之间是否单向连接,无论是直接连接还是间接连接

---初始条件不再是邻接矩阵,而是关系矩阵,如果两个点之间直接单向连接,那么在矩阵中对应的值就为1,反之为0

---根据已有的直接连接关系得出其它所有的间接连接关系,即判断两点之间是否相连,是直接相连还是间接相连

---初始条件为关系矩阵,递推关系为:

   
         A(k)ij = A(k-1)ij 并 (
A(k-1)ik 交 A(k-1)kj
)

 

 
 A(k-1)ij
的意思是说不再在中间加入中间点k,如果在不加入k的情况下它就是连接的,那么结果就是连接,反之就加入中间点

 

k,只有从i到k,再从k到j二者都必须满足连接时,ij之间才是连接的。

 

---伪代码描述

Input:  
关系矩阵A

Output:
 关系矩阵A

foo(A){

n =
A.last;

for k=1
to n

for i=1
to n

for j=1 to n

   
  A[i][j] = A[i][j] 并 (A[i][k] 交 A[k][j])

}

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

<span style="font-family: courier new,courier; font-size: 14px;">public
class Demo {

     public
static void foo(int[][] A) {

           int
n = A. length;

           for
( int k = 0; k < n; k++) {

               for
( int i = 0; i < n; i++) {

                    for
( int j = 0; j < n; j++) {

                        A[i][j] = A[i][j]|(A[i][k]&A[k][j]);

                   }

              }

          }

     }

     public
static void print( int[][] A){

           for
( int i = 0; i < A. length; i++) {

               for
( int j = 0; j < A. length; j++) {

                   System. out. print(A[i][j]+"\t");

              }

              System. out.println();

          }

     }

     public
static void main(String[] args) {

           int[][] A = { { 0, 1, 0, 0, 0
}, { 0, 0, 1, 0, 0
}, { 0, 0, 0, 0, 0
},

                   { 0, 0, 0, 0, 1
}, { 0, 0, 0, 1, 1
} };

           System. out.println( "最初的关系矩阵:"
);

           print(A);

           foo(A);

           System. out.println( "结果矩阵:"
);

           print(A);

     }

}

</span>

结果:

最初的关系矩阵:

0    1    0    0    0

0    0    1    0    0

0    0    0    0    0

0    0    0    0    1

0    0    0    1    1

结果矩阵:

0    1    1    0    0

0    0    1    0    0

0    0    0    0    0

0    0    0    1    1

0    0    0    1    1

Warshall算法

时间: 2024-07-31 20:22:33

Warshall算法的相关文章

poj 3660 Cow Contest(warshall算法)

poj 3660 Cow Contest Description N (1 ≤ N ≤ 100) cows, conveniently numbered 1..N, are participating in a programming contest. As we all know, some cows code better than others. Each cow has a certain constant skill rating that is unique among the co

uva 125 Numbering Paths(warshall算法)

uva 125 Numbering Paths Description Download as PDF Background Problems that process input and generate a simple yes'' orno" answer are called decision problems. One class of decision problems, the NP-complete problems, are not amenable to general ef

Warshall算法求传递闭包

传递闭包 在数学中,在集合 X 上的二元关系 R 的传递闭包是包含 R 的 X 上的最小的传递关系. 例如,如果 X 是(生或死)人的集合而 R 是关系“为父子”,则 R 的传递闭包是关系“x 是 y 的祖先”.再比如,如果 X 是空港的集合而关系 xRy 为“从空港 x 到空港 y 有直航”,则 R 的传递闭包是“可能经一次或多次航行从 x 飞到 y”. Warshall算法 Warshall在1962年提出了一个求关系的传递闭包的有效算法.其具体过程如下,设在n个元素的有限集上关系R的关系矩

求传递闭包的warshall算法

———————————————————————————— Question:R是定义于集合S上的二元关系,求R的传递闭包. Input:relation R,set A Output:t(R),which is the transitive closure of R  Solution:Warshall algorithm ———————————————————————————— 传递闭包(transitive closure) R* = R1 ∪ R2 ∪ R3 ∪ ...... ∪ Rn  

用warshall算法求关系闭包(离散数学)

#include<stdio.h> main() { int i,n,j,k,a,b,x[100][100]; while(scanf("%d",&n)!=EOF) { for(i=1;i<=n;i++) for(j=1;j<=n;j++) scanf("%d",&x[i][j]); for(i=1;i<=n;i++) for(j=1;j<=n;j++) for(k=1;k<=n;k++) { if(x[j]

(转)Floyd算法

原文地址:http://www.cnblogs.com/twjcnblog/archive/2011/09/07/2170306.html 参考资料:http://developer.51cto.com/art/201403/433874.htm 正如我们所知道的,Floyd算法用于求最短路径.Floyd算法可以说是Warshall算法的扩展,三个for循环就可以解决问题,所以它的时间复杂度为O(n^3). Floyd算法的基本思想如下:从任意节点A到任意节点B的最短路径不外乎2种可能,1是直接

找到图中最小有向圈的一个时间复杂度为O(mn)的算法

本文介绍一种在n个点 m条边并且没有负长度有向圈的有向图中找到最小有向圈的一个O(mn)时间复杂度的算法,这一结果是对于之前的最好的时间界O(mn+n^2 loglogn)的一个改进. 此算法首先在O(mn)时间复杂度内找到了具有最小平均长度λ^*的圈,因此它选择了点势函数来使得节约成本是λ^*或者更大.之后,该算法解决了所有点对之间的最短路问题,但是接下来将注意力集中于长度最多为nλ^*的最短路,将每一个源点的最短路时间的计算加速到O(m),这样所有的点时间的计算就到了O(mn). 同时,本文

最短路径算法小结

不同性质的图中,所采取的策略有所不同,自然存在各样的求最短路径的算法. 无向无权图:BFS 有向正权图:Dijkstra 有向无负环图:Bellman-Ford(单点),Floyd-Warshall(任意两点) 有向无环图(dags): 基于动态规划的算法. 广度优先搜索(BFS) 对于无向无权图(也可以假设权值为1),就可以使用最基本的广度优先搜索算法,从源点开始对整个图进行搜索,访问到所有的点.因为广度优先搜索最先访问到的是相邻的点,所以距离最近的点最先访问到,记录的距离也就最小. 算法伪代

搞定编程大赛必知哪10个算法?

再没有比算法更让人头疼的东西了吧! 前两天参加了一个编程大赛http://www.ijiami.cn/newsInfo?id=519&v=2,有感于算法,所以整理了这篇关于编程竞赛的10个算法. 动态规划(DP)似乎占据了大部分的编程竞赛题目,乃至三分之一.当然,DP也不是一个学一次就Ok的单一算法. 这还取决于你是否把数据结构与算法放在同一个等级中考虑.如果你想要在编程竞赛中一展风采的话,当然,有些数据结构是你应该熟悉的.其中最重要的有范围树(Range Tree,也被称为线段树或区间树)和树