Commit 4fa0b3f6 authored by Kirill Smelkov's avatar Kirill Smelkov

.

parent 1859fc9f
...@@ -14,7 +14,15 @@ class Graph: ...@@ -14,7 +14,15 @@ class Graph:
g.edges = set(edges) g.edges = set(edges)
def __str__(g): def __str__(g):
return "Graph nodes=%s edges=%s" % (g.nodes, g.edges) nv = ['%s' % _ for _ in g.nodes]
ev = [setstr(_) for _ in g.edges]
return "Graph nodes={%s} edges={%s}" % (','.join(nv), ', '.join(ev))
def setstr(s):
assert isinstance(s, (set,frozenset)), s
v = ['%s' % (_,) for _ in s]
return '{%s}' % ','.join(v)
# generate all connected graphs with N(nodes) =< N # generate all connected graphs with N(nodes) =< N
...@@ -25,25 +33,43 @@ def genGraphs(N): ...@@ -25,25 +33,43 @@ def genGraphs(N):
Sprevedges = set() # set of edges for all graphs with (i-1) nodes Sprevedges = set() # set of edges for all graphs with (i-1) nodes
for i in range(1,N+1): for i in range(1,N+1):
print()
n = ('r' if i == 1 else 'n%d' % (i-1)) n = ('r' if i == 1 else 'n%d' % (i-1))
nodes = nodes + [n] nodes = nodes + [n]
Sedges = set()
# the graph remains connected if previous (N-1) graph is connected, and n # only 1 node
# is connected to at least one node in the previous graph. if i == 1:
yield Graph(nodes, set())
continue
# only 2 nodes
if i == 2:
yield Graph(nodes, set([frozenset(nodes),]))
Sprevedges.add(frozenset([frozenset(nodes)]))
continue
# induction: the graph remains connected if previous (N-1) graph is
# connected, and n is connected to at least one node in the previous graph.
Sedges = set()
# for all combinations to which nodes n is connected in the previous graph. # for all combinations to which nodes n is connected in the previous graph.
for j in range(1, 1<<(i-1)): for j in range(1, 1<<(i-1)):
Snewconn = set() newconn = set()
for k in range(i-1): for k in range(i-1):
if j & (1 << k): if j & (1 << k):
Snewconn.add((nodes[k], n)) newconn.add(frozenset([nodes[k], n]))
#print("j: %d\tnewconn: %s" % (j, newconn))
#print("Sprevedges: %s" % Sprevedges)
for edges in Sprevedges: for edges in Sprevedges:
for newconn in Snewconn: newedges = edges.union(newconn)
newedges = edges.union(newconn) #print("edges: %s" % edges)
Sedges.add(newedges) #print("newconn: %s" % newconn)
yield Graph(nodes, newedges) #print("newedges: %s" % newedges)
Sedges.add(newedges)
yield Graph(nodes, newedges)
Sprevedges = Sedges Sprevedges = Sedges
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment