2014-11-02 80 views
1

我想实现Warshall的算法来找到邻接矩阵的传递闭包。这是我对功能:我在Warshall算法中缺少什么?

public static int[][] warshall(int A[][]){ 
    int R[][] = A; 
    for (int k = 1; k < n; k++) { 
     for (int i = 1; i < n; i++) { 
      for (int j = 1; j < n; j++) { 
       if ((R[i][j] == 1) || ((R[i][k] == 1) && (R[k][j] == 1))) { 
        A[i][j] = 1; 
       } 
      } 
     } 
     R = A.clone(); 
    } 
    return A; 
} 

我用下面的邻接矩阵测试:

0100 
0001 
0000 
1010 

这将导致:

1111 
1111 
0000 
1111 

我不是越来越接近这一点。任何人都可以随时看到我缺少的东西吗?

感谢您的任何提示或建议。

+0

我没有看到任何这段代码的一部分遍历顶点或边。另外,'n'是什么?它没有在代码块的任何地方定义。 – Makoto 2014-11-02 05:57:24

+0

图也可以表示为矩阵 – 2014-11-02 06:10:00

回答

2

我不熟悉这个特定的算法,但Java和许多其他语言(其中大部分实际上的),你应该总是启动与指数在0和循环不是1

+0

它可以是[Floyd-Warshall](http://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm)的音译,其中循环开始在1并继续| V |。 – Makoto 2014-11-02 05:57:57

+0

哇......我不敢相信我甚至对这个问题感到困扰。我用作参考的书中列出了每个迭代器初始化为1的算法,而不是简单地检查一下,我只是假设这是正确的。我对这个无知的问题表示歉意,并且感谢我从一开始就尝试过的一些建议。 – 2014-11-02 06:00:41

+0

哈哈,np。将它标记为接受然后=) – Eric 2014-11-02 06:01:46