介绍
在进行竞争性编程时,迟早碰到的墙是"图论"。这次,我总结了用代码在Python中创建"邻接矩阵"和"邻接表"的基本方法。根据问题,请自己动手改造。
邻接矩阵和邻接表
例如,考虑下图。
计算机上有两种主要类型的图形数据结构。让我们根据情况正确使用它。
一个是
adj_m.txt
1 2 3 4 5 | [[0, 1, 1, 0, 1], [1, 0, 1, 1, 0], [1, 1, 0, 1, 1], [0, 0, 1, 1, 1], [1, 0, 1, 1, 0]] |
另一个是
adj_l.txt
1 | [[2, 3, 5], [1, 3, 4], [1, 2, 4, 5], [2, 3, 5], [1, 3, 4]] |
实际上,经常给出
当我尝试表示该图的输入时,它如下所示。 (在第一行中输入了顶点数
input.txt
1 2 3 4 5 6 7 8 9 | 5 8 1 2 1 3 1 5 2 3 2 4 3 4 3 5 4 5 |
Python代码
我将编写输入邻接矩阵和邻接列表转换及其相互转换的备忘单。
输入到邻接表
没有边缘重量时。
1 2 3 4 5 6 7 | n, m = map(int, input().split()) graph = [[] for _ in range(n)] for _ in range(m): a, b = map(int, input().split()) graph[a-1].append(b-1) graph[b-1].append(a-1) # 有向グラフなら消す print(graph) # [[2, 3, 5], ..., [1, 3, 4]] |
如果有边缘重物。
1 2 3 4 5 6 7 | n, m = map(int, input().split()) graph = [[] for _ in range(n)] for _ in range(n): u, v, w = map(int, input().split()) graph[u-1].append([v-1, w]) graph[v-1].append([u-1, w]) # 有向グラフなら消す print(graph) # [[2, 3], [3, 1], [5, 9]], ..., [...]] |
输入到邻接矩阵
没有边缘重量时。
1 2 3 4 5 6 7 | n, m = map(int, input().split()) graph = [[0]*n for _ in range(n)] for _ in range(m): a, b = map(int, input().split()) graph[a-1][b-1] = 1 graph[b-1][a-1] = 1 # 有向グラフなら消す print(graph) # [[0, 1, 1, 0, 1], ..., [1, 0, 1, 1, 0]] |
有体重时。
1 2 3 4 5 6 7 | n, m = map(int, input().split()) graph = [[0]*n for _ in range(n)] for _ in range(m): u, v, w = map(int, input().split()) graph[u-1][v-1] = w graph[v-1][u-1] = w # 有向グラフなら消す print(graph) # [[0, 2, 3, 0, 1], ..., [2, 0, 3, 0, 0] |
邻接表到邻接矩阵
定位没有边缘权重的无向图。
邻接列表是
1 2 3 4 5 | graph_new = [[0]*n for _ in range(n)] # 隣接行列 for i, g_i in enumerate(graph): for j in g_i: graph_new[i][j] = 1 print(graph_new) |
邻接表到邻接表
定位没有边缘权重的无向图。
邻接矩阵是
1 2 3 4 5 6 7 8 | graph_new = [] for i in range(n): tmp_l = [] for j in range(n): if graph[i][j] > 0: tmp_l.append(j) graph_new.append(tmp_l) print(graph_new) |
结论
感谢您的阅读。如果您有任何错误或印刷错误,请告诉我,我们将不胜感激。