wolffd@0: function [subtree, nroot_node] = min_subtree_con_nodes(jtree, root, nodes) wolffd@0: %min_subtree_con_nodes get the minimum subtree of tree which contains the nodes wolffd@0: wolffd@0: if isempty(jtree) | isempty(nodes) wolffd@0: subtree = []; wolffd@0: nroot_node = []; wolffd@0: return; wolffd@0: end wolffd@0: wolffd@0: rnodes = min_subtree_nodes(jtree, nodes); wolffd@0: nea_node = nearest_node(jtree, root, nodes); wolffd@0: node_num = length(jtree); wolffd@0: subtree = zeros(node_num); wolffd@0: subtree(rnodes, rnodes) = jtree(rnodes, rnodes); wolffd@0: nroot_node = nea_node; wolffd@0: wolffd@0: wolffd@0: function rnodes = min_subtree_nodes(tree, nodes) wolffd@0: rnodes = []; wolffd@0: if isempty(tree) | isempty(nodes) wolffd@0: return wolffd@0: end wolffd@0: wolffd@0: rnodes = nodes(1); wolffd@0: newnodes = neighbors(tree, nodes(1)); wolffd@0: while ~mysubset(nodes, rnodes) wolffd@0: swapnodes = newnodes; wolffd@0: newnodes = []; wolffd@0: added = 0; wolffd@0: for i=1:length(swapnodes) wolffd@0: inode = swapnodes(i); wolffd@0: tnodes = myunion(inode, rnodes); wolffd@0: if mysubset(nodes, tnodes) wolffd@0: added = 1; wolffd@0: break; wolffd@0: end wolffd@0: nns = neighbors(tree, inode); wolffd@0: add_nodes = mysetdiff(nns, tnodes); wolffd@0: newnodes = myunion(newnodes, add_nodes); wolffd@0: end wolffd@0: if added wolffd@0: rnodes = tnodes; wolffd@0: else wolffd@0: rnodes = myunion(rnodes, newnodes); wolffd@0: end wolffd@0: end wolffd@0: wolffd@0: function nea_node = nearest_node(tree, inode, nodes) wolffd@0: if myismember(inode, nodes) wolffd@0: nea_node = inode; wolffd@0: return; wolffd@0: end wolffd@0: cs = children(tree, inode); wolffd@0: for i = 1:length(cs) wolffd@0: n = cs(i); wolffd@0: nea_node = nearest_node(tree, n, nodes); wolffd@0: end wolffd@0: wolffd@0: wolffd@0: