с учетом матрицы смежности:
{0, 1, 3, 4, 0, 0}
{0, 0, 2, 1, 2, 0}
{0, 1, 0, 3, 0, 0}
{0, 1, 1, 0, 0, 1}
{0, 0, 0, 0, 0, 6}
{0, 1, 0, 1, 0, 0}
следующий код Wolfram Mathematica решает проблему, чтобы найти все простые пути между двумя узлами графа.
Я использовал простую рекурсию и два глобальных var для отслеживания циклов и для сохранения желаемого результата.
код не был оптимизирован только для ясности кода.
«Печать» должна быть полезна, чтобы уточнить, как это работает.
cycleQ[l_]:=If[Length[DeleteDuplicates[l]] == Length[l], False, True];
getNode[matrix_, node_]:=Complement[Range[Length[matrix]],Flatten[Position[matrix[[node]], 0]]];
builtTree[node_, matrix_]:=Block[{nodes, posAndNodes, root, pos},
If[{node} != {} && node != endNode ,
root = node;
nodes = getNode[matrix, node];
(*Print["root:",root,"---nodes:",nodes];*)
AppendTo[lcycle, Flatten[{root, nodes}]];
If[cycleQ[lcycle] == True,
lcycle = Most[lcycle]; appendToTree[root, nodes];,
Print["paths: ", tree, "\n", "root:", root, "---nodes:",nodes];
appendToTree[root, nodes];
];
];
appendToTree[root_, nodes_] := Block[{pos, toAdd},
pos = Flatten[Position[tree[[All, -1]], root]];
For[i = 1, i <= Length[pos], i++,
toAdd = Flatten[Thread[{tree[[pos[[i]]]], {#}}]] & /@ nodes;
(* check cycles!*)
If[cycleQ[#] != True, AppendTo[tree, #]] & /@ toAdd;
];
tree = Delete[tree, {#} & /@ pos];
builtTree[#, matrix] & /@ Union[tree[[All, -1]]];
];
];
для вызова кода:
initNode = 1;
endNode = 6;
lcycle = {};
дерево = {{initNode}};
builtTree [initNode, matrix];
путей: {{1}}
корень: 1 --- узлы: {2,3,4}
пути: {{1,2}, {1,3}, {1,4}}
Корень: 2 --- узлы: {3,4,5}
пути: {{1,3}, {1,4}, {1,2,3}, {1,2,4}, {1,2,5}}
корень: 3 --- узлы: {2,4}
путей: {{1,4}, {1,2,4}, {1,2,5}, {1,3,4}, {1,2,3,4}, {1,3 , 2,4}, {1,3,2,5}}
корень: 4 --- узлы: {2,3,6}
путей: {{1,2,5}, {1,3,2,5}, {1,4,6}, {1,2,4,6}, {1,3,4,6 }, {1,2,3,4,6}, {1,3,2,4,6}, {1,4,2,5}, {1,3,4,2,5}, {1 , 4,3,2,5}}
корень: 5 --- узлы: {6}
ИТОГИ: {{1, 4, 6}, {1, 2, 4, 6}, {1, 2, 5, 6}, {1, 3, 4, 6}, {1, 2, 3 , 4, 6}, {1, 3, 2, 4, 6}, {1, 3, 2, 5, 6}, {1, 4, 2, 5, 6}, {1, 3, 4, 2 , 5, 6}, {1, 4, 3, 2, 5, 6}}
... К сожалению, я не могу загрузить изображения для лучшего отображения результатов: (
http://textanddatamining.blogspot.com