https://en.wikipedia.org/wiki/Seven_Bridges_of_K%C3%B6nigsberg
https://networkx.github.io/
NetworkX. Software for complex networks.
https://networkx.org/documentation/stable/reference/drawing.html
PIP (in a virtual environment) pip install networkx APT (for the entire computer) Debian packages: python-networkx, python3-networkx, and dependencies.
NetworkX is a Python package for the creation, manipulation, and study of the structure, dynamics, and functions of complex networks.
import networkx as nx print(nx.__version__) # 2.2 in Debian 10 G = nx.Graph() # an empty undirected graph # https://mathworld.wolfram.com/LollipopGraph.html # 1---2 (3,1)-lollipop graph # | / # 3---4 vlist = [1, 2, 3, 4] elist = [(1, 2), (1, 3), (2, 3), (3, 4)] for v in vlist: G.add_node(node) for (u, v) in elist: G.add_edge(u, v) G.number_of_nodes() # 4 G.number_of_edges() # 4 G.nodes # NodeView((1, 2, 3, 4)) G.nodes() # NodeView((1, 2, 3, 4)) list(G.nodes) # [1, 2, 3, 4] G.nodes(data=True) # NodeDataView({1: {}, 2: {}, 3: {}, 4: {}}) G.nodes.data() # NodeDataView({1: {}, 2: {}, 3: {}, 4: {}}) list(G.nodes.data()) # [(1, {}), (2, {}), (3, {}), (4, {})] G.edges # EdgeView([(1, 2), (1, 3), (2, 3), (3, 4)]) G.edges() # EdgeView([(1, 2), (1, 3), (2, 3), (3, 4)]) list(G.edges) # [(1, 2), (1, 3), (2, 3), (3, 4)] G.edges(data=True) # EdgeDataView([(1, 2, {}), (1, 3, {}), (2, 3, {}), (3, 4, {})]) G.edges.data() # EdgeDataView([(1, 2, {}), (1, 3, {}), (2, 3, {}), (3, 4, {})]) list(G.edges.data()) # [(1, 2, {}), (1, 3, {}), (2, 3, {}), (3, 4, {})] G[3] # AtlasView({1: {}, 2: {}, 4: {}}) list(G[3]) # [1, 2, 4] G.degree # DegreeView({1: 2, 2: 2, 3: 3, 4: 1}) G.degree() # DegreeView({1: 2, 2: 2, 3: 3, 4: 1}) list(G.degree) # [(1, 2), (2, 2), (3, 3), (4, 1)] G.degree[3] # 3 deg_max = max(deg for (node, deg) in G.degree()) # 3 deg_max_list = [node for (node, deg) in G.degree() if deg == deg_max] # [3]
import matplotlib.pyplot as plt nx.draw(G) #nx.draw(G, with_labels=True, font_weight='bold') #nx.draw_circular(G) #nx.draw_planar(G) #nx.draw_random(G) #nx.draw_spring(G) #nx.draw_shell(G) # Selected keywords: # with_labels=True - draw labels on the nodes # node_size=300 - size of nodes (scalar or array) # node_shape='o' - the shape of the node (string), one of ‘so^>v<dph8’ # node_color='r' - color or array of colors [node_color=(0.5,0.5,0.5)] # edge_color='k' - color or array of colors # width=1.0 - line width of edges (float) # style='solid' - edge line style (solid|dashed|dotted|dashdot) # cmap=None - colormap for mapping intensities of nodes # edge_cmap=None - colormap for mapping intensities of edges # font_size=12 - font size for text labels (int) # font_color='k' - font color (string) # font_weight='normal' - font weight (string) # font_family='sans-serif' - font family (string) plt.show()
# path graph 1--2--3--4 G = nx.Graph() vlist = [(1, 0, 0), (2, 1, 1), (3, 2, 2), (4, 3, 3)] elist = [(1, 2, 1.5), (2, 3, 2.5), (3, 4, 3.5)] for (v, x, y) in vlist: G.add_node(v, pos=(x,y)) for (u, v, w) in elist: G.add_edge(u, v, weight=w) #G.add_edge(u, v, weight=w, color=('green' if w < 3 else 'red')) #G.add_weighted_edges_from(elist) # for weights pos = nx.get_node_attributes(G, 'pos') #{1: (0, 0), 2: (1, 1), 3: (2, 2), 4: (3, 3)} # pos = nx.circular_layout(G) # pos = nx.planar_layout(G) # pos = nx.random_layout(G) # pos = nx.spring_layout(G) # pos = nx.shell_layout(G) weight = nx.get_edge_attributes(G, 'weight') #{(1, 2): 1.5, (2, 3): 2.5, (3, 4): 3.5} #color = nx.get_edge_attributes(G, 'color') # now we can use option edge_color=color.values() nx.draw(G, pos, with_labels=True, font_weight='bold', width=list(weight.values())) plt.show()
https://networkx.org/documentation/stable/reference/generators.html
P_6 = nx.path_graph(6) C_7 = nx.cycle_graph(7) K_5 = nx.complete_graph(5) K_3_5 = nx.complete_bipartite_graph(3, 5) W_5 = nx.wheel_graph(5) barbell = nx.barbell_graph(10, 10) lollipop = nx.lollipop_graph(10, 20) gnm = nx.gnm_random_graph(n=10, m=20) # n nodes, m edges regular = nx.random_regular_graph(d=5, n=10) # random d-regular graph on n nodes ergraph = nx.erdos_renyi_graph(n=10, p=0.5) # p - probability for edge creation petersen = nx.petersen_graph() tutte = nx.tutte_graph() maze = nx.sedgewick_maze_graph() tetra = nx.tetrahedral_graph()