-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsubconncomp.m
58 lines (45 loc) · 1.05 KB
/
subconncomp.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
function [comp, num, subgraph] = subconncomp(g, nodes)
n = sum(nodes);
subgraph = g(nodes, nodes);
subgraph = (subgraph+subgraph') > 0;
comp = makeSet(n);
visited = zeros(n, 1);
for nn = 1:n
if(~visited(nn))
q = nn;
while ~isempty(q)
node = q(1);
visited(node) = 1;
adj = find(subgraph(node, :));
for i=1:length(adj)
comp = unionSet(comp, node, adj(i));
if(~visited(adj(i)))
q = [q; adj(i)];
end
end
q = q(2:end);
end
end
end
comp = flattenSet(comp);
num = length(unique(comp));
end
function par = makeSet(n)
par = 1:n;
end
function [p, par] = findSet(par, i)
if(par(i) ~= i)
par(i) = findSet(par, par(i));
end
p = par(i);
end
function par = unionSet(par, i, j)
[ir, par] = findSet(par, i);
[jr, par] = findSet(par, j);
par(ir) = jr;
end
function par = flattenSet(par)
for i=1:length(par)
[~, par] = findSet(par, i);
end
end