To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.

Statistics Download as Zip
| Branch: | Revision:

root / _FullBNT / BNT / graph / min_subtree_con_nodes.m @ 8:b5b38998ef3b

History | View | Annotate | Download (1.42 KB)

1
function [subtree, nroot_node] = min_subtree_con_nodes(jtree, root, nodes)
2
%min_subtree_con_nodes get the minimum subtree of tree which contains the nodes
3

    
4
if isempty(jtree) | isempty(nodes)
5
    subtree = [];
6
    nroot_node = [];
7
    return;
8
end
9

    
10
rnodes = min_subtree_nodes(jtree, nodes);
11
nea_node = nearest_node(jtree, root, nodes);
12
node_num = length(jtree);
13
subtree = zeros(node_num);
14
subtree(rnodes, rnodes) = jtree(rnodes, rnodes);
15
nroot_node = nea_node;
16

    
17

    
18
function rnodes = min_subtree_nodes(tree, nodes)
19
rnodes = [];
20
if isempty(tree) | isempty(nodes)
21
    return
22
end
23

    
24
rnodes = nodes(1);
25
newnodes = neighbors(tree, nodes(1));
26
while ~mysubset(nodes, rnodes)
27
    swapnodes = newnodes;
28
    newnodes = [];
29
    added = 0;
30
    for i=1:length(swapnodes)
31
        inode = swapnodes(i);
32
        tnodes = myunion(inode, rnodes);
33
        if mysubset(nodes, tnodes)
34
            added = 1;
35
            break;
36
        end
37
        nns = neighbors(tree, inode);
38
        add_nodes = mysetdiff(nns, tnodes);
39
        newnodes = myunion(newnodes, add_nodes);
40
    end
41
    if added
42
        rnodes = tnodes;
43
    else
44
        rnodes = myunion(rnodes, newnodes);
45
    end
46
end
47

    
48
function nea_node = nearest_node(tree, inode, nodes)
49
if myismember(inode, nodes)
50
    nea_node = inode;
51
    return;
52
end
53
cs = children(tree, inode);
54
for i = 1:length(cs)
55
    n = cs(i);
56
    nea_node = nearest_node(tree, n, nodes);
57
end
58
    
59

    
60