networkx というライブラリを使うと隣接行列、隣接リストなど簡単に取得できます。
インストール
bash
1pip install networkx
サンプルコード
python
1import matplotlib.pyplot as plt
2import networkx as nx
3
4nodes = [1, 2, 3, 4, 5]
5edges = [(1, 2), (2, 1), (1, 4), (4, 1), (2, 4), (4, 2),
6 (4, 3), (3, 4), (4, 5), (5, 4), (3, 5), (5, 3)]
7
8# 有向グラフを作成する。
9G = nx.DiGraph()
10# ノード一覧を追加する。
11G.add_nodes_from(nodes)
12# エッジ一覧を追加する。
13G.add_edges_from(edges)
14
15# 隣接行列を返す。
16adj_mat = nx.to_numpy_matrix(G)
17print(adj_mat)
18# [[0. 1. 0. 1. 0.]
19# [1. 0. 0. 1. 0.]
20# [0. 0. 0. 1. 1.]
21# [1. 1. 1. 0. 1.]
22# [0. 0. 1. 1. 0.]]
23
24# 隣接リストを返す。
25adj_list = nx.to_dict_of_lists(G)
26print(adj_list)
27# {1: [2, 4], 2: [1, 4], 3: [4, 5], 4: [1, 2, 3, 5], 5: [4, 3]}
28
29# jupyte notebook を使っていれば、画像が表示される。
30# 使用には apt-get install -y graphviz-dev && pip install pygraphviz が必要
31from IPython.display import Image
32A = nx.nx_agraph.to_agraph(G)
33Image(A.draw(format='png', prog='dot'))
34
追記
標準ライブラリのみを使った隣接リスト作成の例
python
1edges = [(1, 2), (2, 1), (1, 4), (4, 1), (2, 4), (4, 2),
2 (4, 3), (3, 4), (4, 5), (5, 4), (3, 5), (5, 3)]
3
4adj_list = {}
5from itertools import groupby
6for key, group in groupby(sorted(edges), key=lambda x: x[0]):
7 conn_to = [g[1] for g in group] # edge=key が接続しているノード一覧
8 adj_list[key] = conn_to
9
10print(adj_list)
{1: [2, 4], 2: [1, 4], 3: [4, 5], 4: [1, 2, 3, 5], 5: [3, 4]}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/11 02:46
2018/10/11 03:10 編集
2018/10/11 18:05