將您的圖表示爲字符串映射到字符串映射到集合的映射。
更清晰,在Python中,你將有:如果密鑰B
通過在映射條目A
包含A
和B
之間存在
graph = {
'A': {
'B': set(['C', 'D', ...]),
'E': set(['F']),
},
...
}
邊緣。
如果我們來自的節點包含在由graph['A']['B']
映射到的集合中,則可以走此邊。
下面的Python類實現此規範(你可以找到this gist一個註釋版本):
class Graph(object):
def __init__(self):
self.nodes = {}
def addEdge(self, (node1, comingFrom1), (node2, comingFrom2)):
self.nodes.setdefault(node1, {})[node2] = comingFrom1
self.nodes.setdefault(node2, {})[node1] = comingFrom2
def isEdge(self, comingFrom, passingBy, goingTo):
try:
return comingFrom in self.nodes[passingBy][goingTo]
except KeyError:
return False
def destinations(self, comingFrom, passingBy):
dests = set()
try:
for node, directions in self.nodes[passingBy].iteritems():
if comingFrom in directions:
dests.add(node)
except KeyError:
pass
return dests
def sources(self, passingBy, goingTo):
return self.destinations(goingTo, passingBy)
這個類可以這樣使用:
>>> graph = Graph()
>>> graph.addEdge(('0', set([ ])), ('1', set(['3', '2'])))
>>> graph.addEdge(('1', set(['0' ])), ('3', set(['4' ])))
>>> graph.addEdge(('1', set(['0' ])), ('2', set(['5' ])))
>>> graph.addEdge(('3', set(['1', '2'])), ('4', set([ ])))
>>> graph.addEdge(('3', set(['4' ])), ('2', set(['5' ])))
>>> graph.addEdge(('2', set(['1', '3'])), ('5', set([ ])))
>>> print graph.isEdge('0', '1', '3')
True
>>> print graph.isEdge('1', '3', '2')
False
>>> print graph.isEdge('1', '2', '5')
True
>>> print graph.isEdge('5', '2', '3')
True
>>> print graph.isEdge('3', '2', '5')
True
>>> print graph.destinations('0', '1')
set(['3', '2'])
>>> print graph.destinations('1', '3')
set(['4'])
>>> print graph.destinations('3', '4')
set([])
>>> print graph.sources('0', '1')
set([])
>>> print graph.sources('1', '3')
set(['0'])
>>> print graph.sources('3', '4')
所選擇的數據結構和它們的用法已經允許構建有向圖,只需要調整addEdge
方法。
我不認爲這就是我要找的。每個節點只根據你來自哪裏而定向。如果這是我在這種情況下尋找的東西,能否更好地解釋它是如何應用的? – Wilduck 2011-06-16 18:18:50
另外,我試圖張貼一個插圖。它顯示了嗎? – Wilduck 2011-06-16 18:19:08
這個問題表明它不是有向圖。邊的方向取決於您剛通過的節點。 – mwcz 2011-06-16 18:19:59