有向图的平方G =(V,E)是图G2 =(V,E2),使得当且仅当u≠w并且存在顶点v使得u和w都在E2中时u→v和v→w在E2中。输入文件只是将任意顺序的边列为有序的顶点对,每条边都在一条单独的行上。顶点按从1到顶点总数的顺序编号。
*不允许自循环和重复/平行边
如果我们看一下输入数据的例子:
1 6
1 4
1 3
2 4
2 8
2 6
2 5
3 5
3 2
3 6
4 7
4 5
4 6
4 8
5 1
5 8
5 7
6 3
6 4
7 5
7 4
7 6
8 1
然后输出为:
1: 3 4 7 8 5 2 6
2: 5 6 3 4 1 8 7
3: 1 7 8 6 5 4
4: 5 6 8 7 3 1
5: 3 1 4 6
6: 2 7 5 8
7: 1 5 6 8 3 4
8: 6 4 3
我正在用C语言编写代码。
我的想法是遍历文件,查看它们有多少个顶点,然后分配一个指针数组。继续浏览列表再次搜索行中有1的位置,然后查看相应数字所在的位置。如果它不是重复的或相同的数字(1)那么我将从指针数组中将它添加到链表中。我将对文件中的每个数字顶点数执行此操作。
然而,我觉得这非常低效,而不是最好的方法。如果有人有任何其他建议,我将非常感激。
答案 0 :(得分:2)
如果我做对了,你想为每个节点构建一个结果集,其中每个节点都有一个距离为1和2的节点。
因此,可以将边缘保持在位阵列的邻接矩阵中,其中当边存在时位为1,否则为0。
现在可以将此矩阵与其自身相乘。在这种情况下,乘法意味着您可以在行和列上创建AND。
一个小例子(抱歉,不知道如何正确插入矩阵):
0 1 0 0 1 0 0 0 1
0 0 1 x 0 0 1 = 1 1 0
1 1 0 1 1 0 0 1 1
此矩阵包含一个可用于两步可到达的所有节点的矩阵。简单来说,它是两个而不是一个步骤的邻接矩阵。如果你现在将这个矩阵与你的初始矩阵进行OR运算,你就得到了一个矩阵,它保存了长度为1和2的所有路径。
这种方法有很多优点。在第一位操作非常快。 cpu将你的计算结合起来,如果找到一对结果给出一对,你就可以停止结果矩阵单元格。此外,还详细记录了如何并行计算矩阵乘法。
您可以轻松计算所有其他长度的路径。对于长度k,必须计算:
A^k = A^(k-1) * A
希望有所帮助