def ENQUEUE(Q, s):
Q.append(s)
def DEQUEUE(Q):
r = Q.pop(0)
return r
WHITE, GRAY, BLACK = (0, 1, 2)
class Vertex:
def __init__(self, u):
self.value = u
self.color = WHITE
self.d = float("inf")
self.f = float("inf")
self.pi = None
self.num = 0
class Edge:
def __init__(self, u, v):
self.fromV = u
self.toV = v
class EdgeList:
def __init__(self, v):
self.vertex = v
self.connectedV = []
class Graph:
def __init__(self):
self.vertexs = {}
def CONNECT(u, v):
return Edge(u, v)
def INITGRAPH(G, edges):
for e in edges:
if not e.fromV.value in G.vertexs:
G.vertexs[e.fromV.value] = EdgeList(e.fromV)
if not e.toV.value in G.vertexs:
G.vertexs[e.toV.value] = EdgeList(e.toV)
G.vertexs[e.fromV.value].connectedV.append(e.toV)
#G.vertexs[e.toV.value].connectedV.append(e.fromV)
def PRINTLIST(el):
print(el.vertex.value, ":")
for v in el.connectedV:
print(v.value)
def PRINTGRAPH(G):
for v in G.vertexs:
PRINTLIST(G.vertexs[v])
print("-----")
global time
time = 0
def DFS(G, TG):
for u in sorted(G.vertexs.keys()):
G.vertexs[u].vertex.color = WHITE
G.vertexs[u].vertex.pi = None
global time
time = 0
for u in sorted(G.vertexs.keys()):
if G.vertexs[u].vertex.color == WHITE:
DFS_VISIT(G, G.vertexs[u].vertex, TG)
def DFS_VISIT(G, u, TG):
global time
time = time + 1
u.d = time
u.color = GRAY
for v in G.vertexs[u.value].connectedV:
if v.color == WHITE:
v.pi = u
DFS_VISIT(G, v, TG)
u.color = BLACK
time = time + 1
u.f = time
TG.append(u)
#print(u.value, u.d, u.f)
def TOPOLOGICAL_SORT(G):
TG = []
DFS(G, TG)
return TG
def SIMPLE_PATH_NUM(G, s, e):
TG = TOPOLOGICAL_SORT(G)
s.num = 1
TG.reverse()
for v in TG:
if v.num > 0:
for u in G.vertexs[v.value].connectedV:
u.num = v.num + u.num
if v == e:
return e.num
if __name__ == "__main__":
m = Vertex('m')
n = Vertex('n')
o = Vertex('o')
p = Vertex('p')
q = Vertex('q')
r = Vertex('r')
s = Vertex('s')
t = Vertex('t')
u = Vertex('u')
v = Vertex('v')
w = Vertex('w')
x = Vertex('x')
y = Vertex('y')
z = Vertex('z')
edges = []
edges.append(CONNECT(m, q))
edges.append(CONNECT(m, r))
edges.append(CONNECT(m, x))
edges.append(CONNECT(n, o))
edges.append(CONNECT(n, q))
edges.append(CONNECT(n, u))
edges.append(CONNECT(o, r))
edges.append(CONNECT(o, s))
edges.append(CONNECT(o, v))
edges.append(CONNECT(p, o))
edges.append(CONNECT(p, s))
edges.append(CONNECT(p, z))
edges.append(CONNECT(q, t))
edges.append(CONNECT(r, u))
edges.append(CONNECT(r, y))
edges.append(CONNECT(s, r))
edges.append(CONNECT(u, t))
edges.append(CONNECT(v, w))
edges.append(CONNECT(v, x))
edges.append(CONNECT(w, z))
edges.append(CONNECT(y, v))
G = Graph()
INITGRAPH(G, edges)
PRINTGRAPH(G)
print("===========")
TG = TOPOLOGICAL_SORT(G)
for u in TG:
if u.pi != None:
print(u.value, u.d, u.f, u.pi.value)
else:
print(u.value, u.d, u.f)
print("===========")
count = SIMPLE_PATH_NUM(G, p, v)
print(count)
算法导论第二十二章习题解答
需积分: 0 52 浏览量
更新于2017-01-09
收藏 17KB RAR 举报
《算法导论》第二十二章主要探讨了图算法,包括图的基本概念、图的表示方法、最短路径问题、最小生成树以及网络流等问题。这一章的习题解答涵盖了这些核心知识点,旨在帮助读者深入理解和应用这些理论。
一、图的基本概念
在计算机科学中,图是一种数据结构,用于表示对象之间的关系。它由顶点(或节点)和边(或连接)组成。顶点代表实体,边代表它们之间的关系。图可以是无向的(边没有方向)或有向的(边有方向)。此外,图可能带权(每条边都有一个数值,表示从一个顶点到另一个顶点的成本或距离),也可能不带权。
二、图的表示方法
1. 邻接矩阵:使用二维数组存储图中每个顶点的所有邻接顶点,对于有向图,它是稀疏矩阵(大多数元素为零),而对于无向图,它是对称矩阵。
2. 邻接表:为每个顶点维护一个链表,记录与其相邻的顶点,节省空间,尤其适用于稀疏图。
三、最短路径问题
1. Dijkstra算法:解决带权有向图中单源最短路径问题,使用贪心策略,每次选择当前未访问顶点中距离源点最近的一个。
2. Bellman-Ford算法:不仅能处理负权边,还能检测负权环,通过松弛操作逐步更新顶点间的最短路径。
3. Floyd-Warshall算法:求解所有顶点对的最短路径,通过动态规划的方式更新所有可能的路径。
四、最小生成树
1. Kruskal算法:依据边的权重从小到大添加,避免形成环,直到连接所有顶点。
2. Prim算法:从任意顶点开始,每次选择与当前生成树相连且权重最小的边,逐步扩大树的规模。
五、网络流问题
1. Ford-Fulkerson算法:基于增广路径的概念,寻找从源点到汇点的最大流量。
2. Edmonds-Karp算法:是Ford-Fulkerson的一种实现,通过选择增广路径时采用BFS策略,保证了效率。
在解题过程中,如果问题可以用代码表示,应尽可能地编写代码,以体现具体实现。对于一些无法直接编码的题目,需要清晰地阐述解题思路,即使有些题目可能尚未找到答案,表明还需进一步学习和探索。
在"chapter22"的压缩包文件中,可能包含了上述各个知识点的具体习题解答,通过阅读和理解这些解答,读者可以巩固和提升自己在图算法方面的知识和技能。
pokeyode
- 粉丝: 36
- 资源: 26
最新资源
- 使用Python和Pygame实现圣诞节动画效果
- 数据分析-49-客户细分-K-Means聚类分析
- 企业可持续发展性数据集,ESG数据集,公司可持续发展性数据(可用于多种企业可持续性研究场景)
- chapter9.zip
- 使用Python和Pygame库创建新年烟花动画效果
- 国际象棋检测10-YOLO(v5至v11)、COCO、CreateML、Paligemma、TFRecord、VOC数据集合集.rar
- turbovnc-2.2.6.x86-64.rpm
- 艾利和iriver Astell&Kern SP3000 V1.30升级固件
- VirtualGL-2.6.5.x86-64.rpm
- dbeaver-ce-24.3.1-x86-64-setup.exe