If[Length[Names["`*"]] > 0, Remove["`*"]];
(*邻接矩阵*)
A = {{0, 0, 0, 0, 1, 0, 0, 0}, {0, 0, 0, 0, 1, 0, 0, 0}, {0, 0, 0, 1,
0, 0, 0, 0}, {0, 0, 1, 0, 1, 1, 1, 0}, {1, 1, 0, 1, 0, 0, 0,
0}, {0, 0, 0, 1, 0, 0, 0, 1}, {0, 0, 0, 1, 0, 0, 0, 0}, {0, 0, 0,
0, 0, 1, 0, 0}};
g = AdjacencyGraph[A, PlotTheme -> "Detailed"]
adjtab = Association@
Table[i -> (Position[A[[i]], 1] // Flatten), {i, Length[A]}];
(*自定义函数*)
prufer[adjlist_] := Module[
{
(*Subscript[存储b, i]数据*)
blist = {},
(*Subscript[存储a, i]数据*)
alist = {},
adjtab = adjlist,
i, a, b
},
i = 1;
While[Plus @@ Length /@ Values@adjtab > 2 && i < 9,
(*Print[Plus@@Length/@Values@adjtab];*)
leafNode = Position[Length /@ Values[adjtab], 1] // Flatten;
(*Print[adjtab];
Print[leafNode];*)
b = leafNode[[1]];
a = First[adjtab[b]];
(*将b码存入blist*)
AppendTo[blist, b];
(*将a码存入alist*)
AppendTo[alist, a];
(*删除关联表中value=b *)
adjtab = Delete[adjtab, Position[adjtab, b]];
(*将关联表中key=a置成空表*)
adjtab[b] = {};
i++;
];
Return[alist];
]
(*prufer编码*)
prufer[adjtab]
运行结果:
解码
decode[anode_] := Module[
{alist = anode,
edge = {},
blist = {}, a, b, comlist, i, maxNodenum, size
},
size = Length@alist;
maxNodenum = Length@alist + 2;
(*追加n+2到(a1,a2,..an-1)末尾*)
AppendTo[alist, maxNodenum];
i = 1;
While[Length[alist] != 0 && i < 2*maxNodenum,
(*求alist补码*)
comlist =
Complement[Complement[Table[i, {i, maxNodenum}], alist], blist];
(*Print[comlist];
Print[alist];*)
b = Min[comlist];
a = alist[[1]];
AppendTo[blist, b];
If[Length@edge < size,
AppendTo[edge, a <-> b]];
comlist = Delete[comlist, Position[comlist, b]];
alist = Delete[alist, 1];
i++;
(*Print["b","->",b," ","a","->",a];
Print[edge];*)
];
Return[{blist, edge}];
]
alist = {7, 4, 9, 9, 2, 9, 1, 7};
{blist, edge} = decode[alist]
Graph[edge, PlotTheme -> "Detailed"]
运行结果: