Skip to content

Commit 5b8c6e0

Browse files
committed
Merge remote-tracking branch 'origin/main'
2 parents ec5d646 + effe025 commit 5b8c6e0

2 files changed

Lines changed: 68 additions & 0 deletions

File tree

bafna_fvs.py

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import networkx as nx
2+
3+
4+
def cleanup(G):
5+
new_G = G.copy()
6+
while True:
7+
to_remove = [node for node in new_G.nodes if new_G.degree(node) <= 1]
8+
if len(to_remove) == 0:
9+
break
10+
new_G.remove_nodes_from(to_remove)
11+
12+
return new_G
13+
14+
15+
def find_semidisjoint_cycle(G):
16+
for cycle in nx.cycle_basis(G):
17+
cnt = 0
18+
for node in cycle:
19+
if G.degree(node) != 2:
20+
cnt += 1
21+
if cnt > 1:
22+
break
23+
if cnt <= 1:
24+
return cycle
25+
return None
26+
27+
28+
def get_fvs(og_G):
29+
F = set()
30+
i = 0
31+
stack = []
32+
G = og_G.copy()
33+
34+
while len(G.nodes) > 0:
35+
i += 1
36+
sd_cycle = find_semidisjoint_cycle(G)
37+
if sd_cycle is not None:
38+
for node in sd_cycle:
39+
G.node[node]["weight"] = 0.0
40+
41+
else:
42+
gamma = min(1 / (G.degree(node) - 1) for node in G.nodes)
43+
for node in G.nodes:
44+
G.nodes[node]["weight"] -= gamma * (G.degree(node) - 1)
45+
46+
to_remove = [node for node in G.nodes if G.nodes[node]["weight"] == 0.0]
47+
F.update(to_remove)
48+
G.remove_nodes_from(to_remove)
49+
stack.extend(to_remove)
50+
G = cleanup(G)
51+
52+
while len(stack) > 0:
53+
node = stack.pop()
54+
sg = nx.subgraph(og_G, og_G.nodes - (F - {node}))
55+
if nx.is_forest(sg):
56+
F.remove(node)
57+
58+
return F
59+
60+
61+
def get_decycling_number_2_approx(G):
62+
clean_G = cleanup(G)
63+
for node in clean_G.nodes:
64+
clean_G.nodes[node]["weight"] = 1.0
65+
66+
fvs = get_fvs(clean_G)
67+
return len(fvs)

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
networkx==3.5
2+
numpy==2.3.4
23
pyvis==0.3.2

0 commit comments

Comments
 (0)