使用mathematica实现深度优先访问的可视化

运行结果:
使用mathematica实现深度优先访问的可视化_第1张图片
mathmatica版本11.1 下面为代码

If[Length[Names["`*"]] > 0, Remove["`*"]];
edge1 = {
     a <-> b, a <-> e, a <-> f, a <-> g, c <-> g, c <-> d, 
   d <-> g, d <-> e, e <-> f, f <-> g};
gragh = Graph[edge1, PlotTheme -> "Detailed"]
(*节点表*)
node = {
     a, b, c, d, e, f, g};
(*邻接表*)
adjacencylist = {
     {
     b, e, f, g}, {
     a}, {
     d, g}, {
     c, e, g}, {
     a, d, f}, {
     a, 
    e, g}, {
     a, c, d, f}};
(*用关联表存储过程数据*)
asslist = Association[Thread[node -> adjacencylist]];
(*初始化数据集*)
(*初始化空表--根节点、子节点、树--*)
{
     root, subNode, T} = {
     {
     }, {
     }, {
     }};
(*标注表,边集,分支节点集,非访问节点集*)
{
     labeltab, edgetab, branchtab, noAcess} = {
     {
     }, {
     }, {
     }, {
     }}; 
bufProcess = Association["lable" -> {
     }, "edge" -> {
     }, "brach" -> {
     }];
label[node_, step_] := step - 1;
(*第一步*)
step = 1;(*全局标识*)
v = node[[5]];(*第一个节点*)
root = AppendTo[root, v];(*根节点*)
curNode = v;(*当前节点*)
prenode = v;(*上一个节点*)
subNode = asslist[v];(*当前子节点*)
tmp = <|"lable" -> AppendTo[labeltab, v -> label[v, step]], 
   "edge" -> {
     }, "brach" -> AppendTo[branchtab, curNode]|>;
(*建立一个关联表*)
AssociateTo[bufProcess, tmp];*自定义函数*)
DFS[node_] := Module[
  {
     i = 1, w, buflist = asslist, nextnode, tmp},
  (*无访问节点集*)
  noAcess = asslist[node];
  (*当前节点子节点集与无访问节点集存在交集--且无访问集非0*)
  While[IntersectingQ[asslist[curNode], noAcess] && 
    Length@noAcess != 0,
   (*非访问集队列中第一个*)
   w = noAcess[[i]];
   (*追加标识到标识表*)
   If[! MemberQ[Keys@labeltab, w],
    (*全局标识+1*)
    step += 1;
    AppendTo[labeltab, w -> label[w, step]];
    AppendTo[branchtab, w];
    ];
   (*追加边到T*)
   AppendTo[T, curNode -> w];
   (*删除访问过的节点*)
   noAcess = Delete[noAcess, Position[noAcess, w] // Flatten];
   (*从子节点集删除访问过的节点*)
   Delete[subNode, Position[subNode, w]];
   (*删除节点*)
   asslist = Delete[asslist, Position[asslist, w]];
   (*更新回溯节点*)
   prenode = curNode;
   (*更新当前节点为非访问中的节点*)
   curNode = w;
   (*更新当前节点的子节点集*)
   subNode = asslist[w];
   Print[labeltab];
   Print["curNode", "->", curNode, " ", "subNode", "->", subNode];
   tmp = <|"lable" -> labeltab, "edge" -> T, "brach" -> branchtab|>;
   AssociateTo[bufProcess, tmp];
   If[Length@subNode == 0,
    (*递归*)
    (*子节点集为0时,更新当前节点为前一个节点,访问上一个节点*)
    curNode = prenode;
    DFS[curNode],
    (*子节点集不为空时,访问子节点*)
    DFS[w]
    
    ];
   ];
  Return[bufProcess];
  ]
DFS[curNode];
Graph[bufProcess["edge"], PlotTheme -> "Detailed"]

你可能感兴趣的:(算法,图论)