我发现了以下情况:
给定一个有向图,找出给定图中所有顶点对(i,j)的一个顶点j是否可以从另一个顶点i到达。
这里可达意味着从顶点i到j有一条路径。
可达性矩阵称为图的传递闭包。
该图以邻接矩阵的形式给出,称为“graph[V][V]”,其中,如果从顶点i到顶点j有一条边或i等于j,则graph[i][j]为1,否则graph[i][j]为0。
我们可以用Floyd Warshall计算距离矩阵dist[V][V],如果dist[i][j]是无穷大的,那么j是不可及的,否则j是可及的,dist[i][j]的值小于V。

// Prints transitive closure of graph[][] using Floyd Warshall algorithm
void transitiveClosure(int graph[][V])
{
    /* reach[][] will be the output matrix that will finally have the shortest
      distances between every pair of vertices */
    int reach[V][V], i, j, k;

    /* Initialize the solution matrix same as input graph matrix. Or
       we can say the initial values of shortest distances are based
       on shortest paths considering no intermediate vertex. */
    for (i = 0; i < V; i++)
        for (j = 0; j < V; j++)
            reach[i][j] = graph[i][j];

    /* Add all vertices one by one to the set of intermediate vertices.
      ---> Before start of a iteration, we have reachability values for all
      pairs of vertices such that the reachability values consider only the
      vertices in set {0, 1, 2, .. k-1} as intermediate vertices.
      ----> After the end of a iteration, vertex no. k is added to the set of
      intermediate vertices and the set becomes {0, 1, 2, .. k} */
    for (k = 0; k < V; k++)
    {
        // Pick all vertices as source one by one
        for (i = 0; i < V; i++)
        {
            // Pick all vertices as destination for the
            // above picked source
            for (j = 0; j < V; j++)
            {
                // If vertex k is on a path from i to j,
                // then make sure that the value of reach[i][j] is 1
                reach[i][j] = reach[i][j] || (reach[i][k] && reach[k][j]);
            }
        }
    }

    // Print the shortest distance matrix
    printSolution(reach);
}

首先,你能解释一下为什么函数的参数是graph[][v],而不是graph[v]?
那么我们为什么要用图[v][v]来初始化矩阵,使每对顶点之间的距离最短?
你能解释一下初始化后在for循环中做了什么吗?
我们怎么写这个命令:reach[i][j] = reach[i][j] || (reach[i][k] && reach[k][j]);elsewhise?
编辑:图形是布尔矩阵,还是不是?
如果是的话,那么不也是布尔矩阵吗?
所以如果我们有这个命令:(reach[i][j]=reach[i][j](reach[i][k]&&reach[k][j]);如果reach[i][j]=1,那么我们是否执行这个命令:reach[i][j]=reach[i][j],否则我们要检查(reach[i][k]+reach[k][j])是否为非零?
还是我理解错了?

最佳答案

首先,你能解释一下为什么函数的参数是
graph[][v]而不是graph[v][v]?
它也可以是图形我更喜欢graph[v][v],因为无论如何这是预期的输入。
那么为什么我们要初始化矩阵,最终得到
每对顶点之间的最短距离,用图[v][v]?
这是因为节点a和b之间的距离肯定最多是a和b之间边的值(如果没有边,假设它是无限的)。
如果我们有一个图,在A和B之间有长度为5的边,我们可以肯定地存在长度为5的A和B之间的路径,但是可能存在较短的路径。
这里有一些重要的事情要注意。如果你只对可达性感兴趣,那么你就不在乎实际的距离。在这种情况下,如果不存在任何路径,只要设置路径,就可以将值设置为0,如果存在路径,则可以设置为1。
你能解释一下在初始化之后,在
为了循环?
您基本上是在使用动态编程方法说明很长,请在这里阅读:http://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm
我们怎么写这个命令:reach[i][j]=reach[i][j]||
(到达[i][k]&&reach[k][j]);其他?
我们可以写为:reach[i][j]|=(reach[i][k]&&reach[k][j])

10-07 22:27