#有向图转无向图
def Directed_to_undirected(A):
return [[1 if A[i][j] == 1 or A[j][i] == 1 else 0 for j in range(len(A[i]))] for i in range(len(A))]
#有向图转序列
def Directed_to_sequence(A):
return Undirected_to_sequence(Directed_to_undirected(A))
#序列转有向图,默认LX中的ID是从0开始连续增加的
def Sequence_to_directed(LX):
edges = set()
for X in LX:
for i in range(len(X)-1):
edges.add((X[i], X[i+1]))
#首尾不想等则加入该边
if X[0] != X[-1]:
edges.add((X[-1], X[0]))
n = max([max(X) for X in LX])+1
return [[1 if (i, j) in edges else 0 for j in range(n)] for i in range(n)]
#序列转无向图
def Sequence_to_undirected(LX):
return Directed_to_undirected(Sequence_to_directed(LX))
#无向图转序列
def Undirected_to_sequence(A):
edges = {i: set() for i in range(len(A))}
for i in range(len(A)):
for j in range(i + 1, len(A)):
if A[i][j] == 1:
edges[i].add(j)
edges[j].add(i)
#找起点
items = [[k, len(v)] for k, v in edges.items()]
items.sort(key=lambda x:x[1], reverse=True)
p0 = items[0][0]
LX = []
while len(edges) > 0:
X = [p0]
now = p0
while now in edges and len(edges[now]) > 0:
next = edges[now].pop()
if len(edges[now]) == 0:
del edges[now]
edges[next].remove(now)
if len(edges[next]) == 0:
del edges[next]
if next == p0:
break
X.append(next)
now = next
LX.append(X)
return LX
#无向图转有向图
def Unirected_to_directed(A):
return Sequence_to_directed(Undirected_to_sequence(A))
if __name__ == '__main__':
LX = [[0, 1, 2], [0, 3, 5], [0, 4]]
A_undir = Sequence_to_undirected(LX)
LX1 = Undirected_to_sequence(A_undir)
print(LX1)
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交