Skip to content

Commit 3a64420

Browse files
committed
带权图的初步实现
1 parent 506c5c1 commit 3a64420

File tree

3 files changed

+60
-14
lines changed

3 files changed

+60
-14
lines changed

Graph/AdjacencyList.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ def __init__(self, filename):
2828
self.adj[v1].append(v2)
2929
self.adj[v2].append(v1)
3030
line_num += 1
31+
print(self.adj)
3132

3233
def get_graph_information(self):
3334
"""

WeightedGraph/weightedGraph.py

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
"""
22
@author: Alex
33
@contact: 1272296763@qq.com or jakinmili@gmail.com
4-
@file: AdjacencyList.py
4+
@file: weightedGraph.py
55
@time: 2019/10/20 19:12
66
"""
7-
class AdjList:
7+
class weightedGraph:
88

99
def __init__(self, filename):
1010
self.V = 0 # 顶点数
@@ -18,17 +18,19 @@ def __init__(self, filename):
1818
v, e = line.strip().split()
1919
self.V = int(v)
2020
self.E = int(e)
21-
self.adj = [[] for i in range(self.V)] # 创建二维数组即邻接表
21+
self.adj = [{} for i in range(self.V)] # 创建二维数组 且 以字典为单位即邻接表
2222
else:
2323
# 读取边 写入邻接表
24-
v1, v2 = line.strip().split()
24+
v1, v2, w = line.strip().split()
2525
# 转化为整数
2626
v1 = int(v1)
2727
v2 = int(v2)
28-
self.adj[v1].append(v2)
29-
self.adj[v2].append(v1)
28+
w = int(w)
29+
self.adj[v1][v2] = w
30+
self.adj[v2][v1] = w
3031
line_num += 1
31-
32+
print(self.adj)
33+
print(self.adj[0])
3234
def get_graph_information(self):
3335
"""
3436
打印图的邻接表
@@ -58,6 +60,10 @@ def hasEdge(self, v, w):
5860
self.validateVertex(w)
5961
return w in self.adj[v]
6062

63+
def getWeight(self, v, w):
64+
if self.hasEdge(v, w):
65+
return self.adj[v][w]
66+
6167
def degree(self, v):
6268
"""
6369
求某个顶点的度
@@ -101,9 +107,6 @@ def get_cccount(self):
101107
return self.__cccount
102108

103109
if __name__ == '__main__':
104-
adjl = AdjList("../g.txt")
105-
adjl.get_graph_information()
106-
print(adjl.hasEdge(0,4))
107-
print(adjl.degree(1))
108-
print(adjl.graphDFS())
109-
print(adjl.get_cccount())
110+
weighted_graph = weightedGraph("g.txt")
111+
print(weighted_graph.getWeight(0, 1))
112+

readme.md

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,4 +257,46 @@ USSSPath类中
257257

258258
hl = HamiltonPath("g3.txt", 1)
259259
hl.get_graph_information()
260-
hl.getHamiltonPath()
260+
hl.getHamiltonPath()
261+
262+
#### 4.4 欧拉回路(Euler Loop)
263+
264+
##### 4.4.1 欧拉回路的存在性质
265+
266+
在一个无向联通图中,每个点的度数为偶数 是 图存在欧拉回路的充要条件
267+
268+
**证明:**
269+
1. 从某一点顶点出发,若该图是联通的且满足顶点的度数都为偶数,说明该图存在环
270+
2. 如果这个环是原图,说明找到了欧拉回路,否则,剩下的边一定和找到的环相连(因为原图是联通的)
271+
且所有顶点的度数都是偶数(因为在遍历完成一个顶点的过程中,总是会一进一出,所以会导致度数减2,
272+
此时依然是偶数)。根据1,说明剩下的边一定存在环
273+
3. 两个相连的环相连,一定组成一个新的环
274+
275+
##### 4.4.1 欧拉回路的判断
276+
277+
只需要抓住联通和度数来判断即可,满足以下条件即为Euler Loop
278+
1. 联通分量为1
279+
2. 度数为偶数
280+
281+
282+
ELD = EulerLoopDetection("g.txt")
283+
ELD.get_graph_information()
284+
ELD.hasEulerLoop()
285+
286+
ELD2 = EulerLoopDetection("g2.txt")
287+
ELD2.get_graph_information()
288+
ELD2.hasEulerLoop()
289+
290+
g2图:
291+
292+
![img](img/Euler/g1.png)
293+
294+
295+
##### 4.4.2 欧拉回路路径(Hierholzer算法)
296+
待更~
297+
298+
299+
### 5. 带权图
300+
301+
302+

0 commit comments

Comments
 (0)