File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 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 )
Original file line number Diff line number Diff line change 11networkx == 3.5
2+ numpy == 2.3.4
23pyvis == 0.3.2
You can’t perform that action at this time.
0 commit comments