我有一个图像,我收集了一些点,这些点代表了我的图表中代表顶点的区域的质心。 我的积分列表如下:
[(455, 472), (343, 472), (208, 471), (478, 456), (460, 441), (428, 439),
(413, 458), (48, 439), (107, 460), (130, 413), (179, 385), (250, 396),
(20, 373), (431, 381), (483, 355), (342, 390), (441, 343), (312, 344),
(283, 336), (259, 342), (409, 329),..............................]
现在我寻找一些边缘,在我的代码中做一些操作会生成这种类型的(p1,p2)列表,其中p1 ---- p2是一个边缘:
[((343, 472), (342, 390)), ((343, 472), (312, 344)),
((343, 472), (337, 302)), ((478, 456), (460, 441)),...................]
现在我想实现一些算法,比如Dijksra或BFS。
查看其他SO问题和实现,我注意到大多数图表都表示为邻接矩阵。
我想的不是像我一样添加边缘,而是将它们直接添加到哈希表或字典对象中。问题是 - 我给出了一个顶点的名字是什么?假设我有(343,472)
,我不明白该如何去做一个看起来像这样的字典:{A : [p1,p2...], B: [p3,....], ... }
这样做的好方法是什么?我添加了一个代码,显示我如何创建边缘表示:
def makeEdgesFromSpots(centroids, imageForEdges):
edges = []
for c1 in centroids:
for c2 in centroids:
if(c1[0] == c2[0] and c1[1] == c2[1]):
continue
else:
//checkPointsForPath does some testing,
// to check if I want these points as an edge.
isLine = checkPointsForPath(c1,c2,imageForEdges)
if isLine == True:
edges.append((c1,c2))
return edges
答案 0 :(得分:0)
如果您的图表未加权且没有多边距,则可以使用defaultdict
set
值:
from collections import defaultdict
import pprint
edges = [((343, 472), (342, 390)), ((343, 472), (312, 344)),
((343, 472), (337, 302)), ((478, 456), (460, 441))]
adj_matrix = defaultdict(set)
for x, y in edges:
adj_matrix[x].add(y)
adj_matrix[y].add(x) # Assuming undirected graph
pprint.pprint(adj_matrix)
输出:
defaultdict(<class 'set'>,
{(312, 344): {(343, 472)},
(337, 302): {(343, 472)},
(342, 390): {(343, 472)},
(343, 472): {(312, 344), (337, 302), (342, 390)},
(460, 441): {(478, 456)},
(478, 456): {(460, 441)}})
除非您出于特定目的明确需要名称,否则无需命名顶点。