python新手。尝试使用networkX包来完成工作,但它似乎比#34;创建列表列表更长的运行时间"代表图。那只是因为nextworkX的数据结构对于这个简单的任务来说太过分了吗? 顺便说一句,结果将输出两倍的答案。因为read_adjlist函数将为文件中的u和v节点计算两次相同的边。有没有办法避免这种情况,并且还允许识别平行边缘?
谢谢大家。
import networkx as nx
import random
Graph_Adjacency_List = "***.txt"
handle = open(Graph_Adjacency_List, 'r')
G=nx.read_adjlist(handle,create_using=nx.MultiGraph(), nodetype=int)
def cut(G):
while G.number_of_nodes()>2 :
u,v= random.choice(G.edges())
G = nx.contracted_edge(G, (u, v), self_loops=False)
return G.number_of_edges()
m=100
for i in range(1000):
random.seed()
c=cut(G)
if c< m:
m=c
print m
答案 0 :(得分:2)
为了解决边缘的重复计算问题,我简单地回复了:
int(G.number_of_edges()/2)
而不是:
G.number_of_edges()
为了解决算法速度慢的问题,我没有使用nx.contracted_edge,该函数返回一个新图形,花费了很多时间,就像其他人评论一样。我做了适当的操作,查看nx.contracted_edge的源代码并用G交换H:
new_edges = ((u, w, d) for x, w, d in G.edges(v, data=True)
if False or w != u)
v_data = G.node[v]
G.remove_node(v)
G.add_edges_from(new_edges)
if 'contraction' in G.node[u]:
G.node[u]['contraction'][v] = v_data
else:
G.node[u]['contraction'] = {v: v_data}