本网站有很多关于我的问题的文章。 我有一个矩阵例如(10 x 10)代表10个节点。该矩阵称为MyMat(9,9)
此矩阵的行表示源节点(From Node),列表示目标节点(To Node)。它有14个随机分布的链接。非零值表示节点之间的连接。
0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0
我想要的是防止系统中每个节点的循环(循环)。例如: 节点1:无循环
节点2:2,9,7,8,10,2。这里循环存在,因为它以2开始并以2完成。我想要阻止此网络中的循环。这意味着:MyMat(9,1)必须为0 节点2:2,9,7,8,10,3,2。这意味着MyMat(2,1)必须为0
节点3:无循环
节点4:4,7,8,4。这意味着MyMat(7,3)必须为0
节点5:5,8,10,6,5。这意味着MyMat(5,4)必须为0
节点6:无循环
节点7:无循环
节点8:无循环
节点9:无循环
节点10:无循环
从上面的矩阵中删除了4个连接。
我通过一种名为Depth first search的技术完成了这项工作,但它非常慢,并且加重了程序的运行时间,特别是当我使用60个节点和100个连接时! 如果您使用Google,可以找到几个编程示例。
在visual basic或C#中有更简单(更快)的方法吗?
答案 0 :(得分:1)
深度优先搜索不应该花很长时间。
Procedure Depth_First_Clean(graph, v){
color v grey
for each edge (v,u){
if u is grey
delete edge (v,u)
else if u is white
Depth_First_Clean(graph, u)
}
color v black
}
Procedure Clean_all(graph) {
Mark all nodes white
While there are white nodes left {
v = a white node
Depth_First_Clean(graph, v)
}
这会遍历每个边缘一次,因此在具有100个边缘的图形中几乎不需要时间。
从示例中确定(我将重新编号节点以摆脱我们的示例中的一个问题的混乱
0 1 2 3 4 5 6 7 8 9
0 0 0 0 0 1 0 0 0 0 0
1 0 0 0 1 0 0 0 0 1 0
2 0 1 0 0 0 0 0 0 0 0
3 0 0 0 0 0 0 1 0 0 0
4 0 0 0 0 0 0 0 1 0 0
5 0 0 0 0 1 0 0 0 0 0
6 0 0 0 0 0 0 0 1 0 0
7 0 0 0 1 0 0 0 0 0 1
8 0 0 0 0 0 0 1 0 0 0
9 0 1 1 0 0 1 0 0 0 0
we mark all nodes white.
We start with node 0
mark node 0 grey
traverse edge (0,4)
mark node 4 grey
traverse edge (4, 7)
mark node 7 grey
traverse edge (7, 3)
mark node 3 grey
traverse edge (3,6)
mark node 6 grey
delete edge (6, 7) -- node 7 is grey break cycle 7 3 6 7
color node 6 black
color node 3 black
traverse edge (7, 9)
mark node 9 grey
traverse edge (9, 1)
mark node 1 grey
skip edge (1,3) -- 3 is black there are no cycles through 3
traverse edge (1, 8)
mark node 8 grey
skip edge (8, 6)
color node 8 black
color node 1 black
traverse edge (9, 2)
color node 2 grey
skip edge (2,1)
color node 2 black
traverse edge (9, 5)
color node 5 grey
delete edge (5, 4)
color node 5 black
color node 9 black
color node 7 black
color node 4 black
color node 0 black
None of the remening nodes are white so we are done
答案 1 :(得分:0)
我找到了解决方案。
Public Function DFS3(ByVal V As Integer) As Integer
TheList(V) = "G"
For U = 0 To NumberofNodes - 1
If Matt(V, U) > 0 Then
If TheList(U) = "G" Then
Matt(V, U) = 0
RichTextBox1.AppendText("Link " & V + 1 & " " & U + 1 & " Deleted " & vbNewLine)
ElseIf TheList(U) = "W" Then
DFS3(U)
End If
End If
Next U
TheList(V) = "B"
End Function