大家好,欢迎来到IT知识分享网。
如何判断一个图是强连通图?
强连通图(strongly connected):在一个图中,任意两点x,y,都可以互相到达(可以借助其他点作为中转);
1 简单方法
对每个结点进行DFS或者BFS搜索,如果每次搜索的结果,使得每个点的state都标记为“Processed”,则表示该图为强连通图,时间复杂度为,其中是DFS的时间复杂度;
2 通过hub来判断强连通图
先验知识:
2.1 图的转置
图中所有的点不变,但是所有的边的方向都反向
输入样例:
graph_string = """\
D 3 W
0 1 7
1 0 -2
0 2 0
"""
转换为邻接表:
代码:
def transpose(graph_adj_list):
ans = [[] for i in range(len(graph_adj_list))]
for i, edges in enumerate(graph_adj_list):
for edge in edges:# i mean index, edge mean every edge in edges
start = i
end = edge[0]
tup = (start, edge[1])
ans[end].append(tup)
return ans
graph_string = """\
D 3 W
0 1 7
1 0 -2
0 2 0
"""
graph_adj_list = adjacency_list(graph_string)
print(graph_adj_list)
graph_transposed_adj_list = transpose(graph_adj_list)
for i in range(len(graph_transposed_adj_list)):
print(i, sorted(graph_transposed_adj_list[i]))
2.2 Hub (中心)
一个点h为hub的条件:(a) h可以到达图中的所有点,(b) 图中的所有点可以到达h。
- 如果一个图中存在一个hub h,那么该图就为强连通图;?
- 因为图中的任意两个点都可以通过hub h进行中转,所以该图中任意两个点都互联。
- 另外的,如果该图中所有的点都可以通过该hub h进行中转而相连,也就表示该图中的所有点都为hub。
2.3 判断强连通图
根据上述定义,判断强连通图的步骤为:
- 在图G上任意选择一点h,进行DFS或者BFS搜索;
- 如果图G上存在一个点为“Undiscovered”,则返回False;
- 构建图G的转置图G‘
- 在G’上选择相同的点h,进行DFS或者BFS搜索;
- 如果图G’上存在一个点为“Undiscovered”,则返回False;
- 否则就返回True;
将图转置,即将所有的边反向,在1中进行搜索,保证了条件(a);转之后,在4中再次进行搜索,保证了条件(b);最后如果两次搜索都没有点‘Undiscovered’,则表示点h为hub,则由对hub的结论可知,该图为强连通图;
def is_strongly_connected(adj_list):
state1 = dfs_tree(adj_list, 0) #step 1
for state in state1:
if state != 'P':
return False #step 2
adj_list1 = transpose(adj_list) #step 3
state2 = dfs_tree(adj_list1, 0) #step 4
for state in state2:
if state != 'P':
return False #step 5
return True #step 6
该算法的时间复杂度为
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/14701.html