本文整理汇总了Python中sage.graphs.digraph.DiGraph.has_edge方法的典型用法代码示例。如果您正苦于以下问题:Python DiGraph.has_edge方法的具体用法?Python DiGraph.has_edge怎么用?Python DiGraph.has_edge使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类sage.graphs.digraph.DiGraph
的用法示例。
在下文中一共展示了DiGraph.has_edge方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: strong_orientations_iterator
# 需要导入模块: from sage.graphs.digraph import DiGraph [as 别名]
# 或者: from sage.graphs.digraph.DiGraph import has_edge [as 别名]
#.........这里部分代码省略.........
EXAMPLES:
A cycle has one possible (non-symmetric) strong orientation::
sage: g = graphs.CycleGraph(4)
sage: it = g.strong_orientations_iterator()
sage: len(list(it))
1
A tree cannot be strongly oriented::
sage: g = graphs.RandomTree(100)
sage: len(list(g.strong_orientations_iterator()))
0
Neither can be a disconnected graph::
sage: g = graphs.CompleteGraph(6)
sage: g.add_vertex(7)
sage: len(list(g.strong_orientations_iterator()))
0
TESTS:
sage: g = graphs.CompleteGraph(2)
sage: len(list(g.strong_orientations_iterator()))
0
sage: g = graphs.CubeGraph(3)
sage: b = True
sage: for orientedGraph in g.strong_orientations_iterator():
....: if not orientedGraph.is_strongly_connected():
....: b = False
sage: b
True
The total number of strong orientations of a graph can be counted using
the Tutte polynomial evaluated at points (0,2)::
sage: g = graphs.PetersenGraph()
sage: nr1 = len(list(g.strong_orientations_iterator()))
sage: nr2 = g.tutte_polynomial()(0,2)
sage: nr1 == nr2/2 # The Tutte polynomial counts also the symmetrical orientations
True
"""
# if the graph has a bridge or is disconnected,
# then it cannot be strongly oriented
if G.order() < 3 or not G.is_biconnected():
return
V = G.vertices()
Dg = DiGraph([G.vertices(), G.edges()], pos=G.get_pos())
# compute an arbitrary spanning tree of the undirected graph
te = kruskal(G)
treeEdges = [(u,v) for u,v,_ in te]
A = [edge for edge in G.edges(labels=False) if edge not in treeEdges]
# initialization of the first binary word 00...0
# corresponding to the current orientation of the non-tree edges
existingAedges = [0]*len(A)
# Make the edges of the spanning tree doubly oriented
for e in treeEdges:
if Dg.has_edge(e):
Dg.add_edge(e[1], e[0])
else:
Dg.add_edge(e)
# Generate all orientations for non-tree edges (using Gray code)
# Each of these orientations can be extended to a strong orientation
# of G by orienting properly the tree-edges
previousWord = 0
i = 0
# the orientation of one edge is fixed so we consider one edge less
nr = 2**(len(A)-1)
while i < nr:
word = (i >> 1) ^ i
bitChanged = word ^ previousWord
bit = 0
while bitChanged > 1:
bitChanged >>= 1
bit += 1
previousWord = word
if existingAedges[bit] == 0:
Dg.reverse_edge(A[bit])
existingAedges[bit] = 1
else:
Dg.reverse_edge(A[bit][1], A[bit][0])
existingAedges[bit] = 0
# launch the algorithm for enumeration of the solutions
for sol in _strong_orientations_of_a_mixed_graph(Dg, V, treeEdges):
yield sol
i = i + 1
示例2: is_partial_cube
# 需要导入模块: from sage.graphs.digraph import DiGraph [as 别名]
# 或者: from sage.graphs.digraph.DiGraph import has_edge [as 别名]
#.........这里部分代码省略.........
for v in level:
for w in level[v]:
bitvec[w] |= bitvec[v]
# Make graph of labeled edges and union them together
labeled = Graph([contracted.vertices(), []])
for v, w in contracted.edge_iterator(labels = False):
diff = bitvec[v]^bitvec[w]
if not diff or bitvec[w] &~ bitvec[v] == 0:
continue # zero edge or wrong direction
if diff not in neighbors:
return fail
neighbor = neighbors[diff]
unionfind.union(contracted.edge_label(v, w),
contracted.edge_label(root, neighbor))
unionfind.union(contracted.edge_label(w, v),
contracted.edge_label(neighbor, root))
labeled.add_edge(v, w)
# Map vertices to components of labeled-edge graph
component = {}
for i, SCC in enumerate(labeled.connected_components()):
for v in SCC:
component[v] = i
# generate new compressed subgraph
newgraph = DiGraph()
for v, w, t in contracted.edge_iterator():
if bitvec[v] == bitvec[w]:
vi = component[v]
wi = component[w]
if vi == wi:
return fail
if newgraph.has_edge(vi, wi):
unionfind.union(newgraph.edge_label(vi, wi), t)
else:
newgraph.add_edge(vi, wi, t)
contracted = newgraph
# Make a digraph with edges labeled by the equivalence classes in unionfind
g = DiGraph({v: {w: unionfind.find((v, w)) for w in G[v]} for v in G})
# Associates to a vertex the token that acts on it, an check that
# no two edges on a single vertex have the same label
action = {}
for v in g:
action[v] = set(t for _, _, t in g.edge_iterator(v))
if len(action[v]) != g.out_degree(v):
return fail
# Associate every token to its reverse
reverse = {}
for v, w, t in g.edge_iterator():
rt = g.edge_label(w, v)
reverse[t] = rt
reverse[rt] = t
current = initialState = next(g.vertex_iterator())
# A token T is said to be 'active' for a vertex u if it takes u
# one step closer to the source in terms of distance. The 'source'
# is initially 'initialState'. See the module's documentation for
# more explanations.
# Find list of tokens that lead to the initial state
activeTokens = set()