Commit 0b525e3e authored by Kirill Smelkov's avatar Kirill Smelkov

.

parent 2c427c0f
#!/usr/bin/env python
"""generate all connected graphs up to N nodes"""
from __future__ import print_statement
class Graph:
# .nodes {nodes}
# .edges {edges}
def __init__(nodes, edges):
self.nodes = set(nodes)
self.edges = set(edges)
def __str__(self):
return "Graph nodes=%s edges=%s" % (self.nodes, self.edges)
# generate all connected graphs with N(nodes) =< N
def genGraphs(N):
assert N >= 1
nodes = [] # of all nodes
Sprevedges = set() # set of edges for all graphs with (i-1) nodes
for i in range(N):
n = ('r' if i == 0 else 'n%d' % i)
nodes = nodes + [n]
Sedges = set()
# the graph remains connected if previous (N-1) graph is connected, and n
# is connected to at least one node in the previous graph.
# for all combinations to which nodes n is connected in the previous graph.
for j in range(1,2**(i-1)):
Snewconn = set()
for k in range(i-1):
if j & (1 << k):
Snewconn.add((nodes[k], n))
for edges in Sprevedges:
for newconn in Snewconn:
newedges = edges.union(newconn)
Sedges.add(newedges)
yield Graph(node, newedges)
Sprevedges = Sedges
def main():
N = int(sys.argv[1])
for g in genGraphs(N):
print(g)
if __name__ == '__main__':
main()
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