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