使用 NetworkX 的 neighbors 方法来检测和消除路径长度仅为 2 的树。该方法可以获取给定节点的所有邻居节点。如果一个节点的邻居节点为空,则该节点是路径长度为 2 的树的一部分,可以将其从图中移除。
import networkx as nx
import matplotlib.pyplot as plt
G = nx.DiGraph()
f = open("test_data.csv", "r")
for line in f:
node1, node2, weight1 = line.split(",")
G.add_edge(node1, node2)
for src, trg in G.edges():
if G.neighbors(trg) == []:
G.remove_edge(*(src,trg)) # Need the * to unpack the edge nodes
nx.draw(G)
plt.show()
方法二:使用 NetworkX 的 bellman_ford 方法
也可以使用 NetworkX 的 bellman_ford 方法来检测和消除路径长度仅为 2 的树。该方法可以找到图中任意两点之间的最短路径。如果两点之间的最短路径长度小于或等于 2,则该路径是路径长度为 2 的树的一部分,可以将其从图中移除。
import networkx as nx
import matplotlib.pyplot as plt
G = nx.DiGraph()
f = open("test_data.csv", "r")
for node1, node2, weight1 in data:
G.add_edge(node1, node2, weight=-1)
min_lenght = 2
F = nx.DiGraph()
for u, v in G.edges():
vals, distances = nx.bellman_ford(G, u)
if min(distances.values()) < - min_lenght:
for u, v in vals.items():
if v:
F.add_edge(v, u)
nx.draw(F)
plt.show()
方法三:使用 dict 来存储节点和边的信息
也可以使用 Python 的 dict 来存储节点和边的信息,然后遍历 dict 来检测和消除路径长度仅为 2 的树。
import networkx as nx
import matplotlib.pyplot as plt
G = nx.DiGraph()
f = open("test_data.csv", "r")
blocs_by_node = {}
for line in f:
node1, node2, weight1 = line.split(",")
if node1 not in blocs_by_node and node2 not in blocs_by_node :
bloc = [node1, node2]
blocs_by_node[node1] = bloc
blocs_by_node[node2] = bloc
elif node1 not in blocs_by_node and node2 in blocs_by_node :
bloc = blocs_by_node[node2]
bloc.append(node1)
blocs_by_node[node1] = bloc
elif node1 in blocs_by_node and node2 not in blocs_by_node :
bloc = blocs_by_node[node1]
bloc.append(node2)
blocs_by_node[node2] = bloc
elif blocs_by_node[node1] is not blocs_by_node[node2] :
bloc = blocs_by_node[node1]
for node in blocs_by_node[node2] :
bloc.append(node)
blocs_by_node[node] = bloc
f.close()
f = open("test_data.csv", "r")
for line in f:
node1, node2, weight1 = line.split(",")
if len(blocs_by_node[node1]) > 2 :
G.add_edge(node1, node2)
f.close()
nx.draw(G)
plt.show()
Espero que esto te ayude!