📌  相关文章
📜  门| Sudo GATE 2020 Mock III(2019 年 1 月 24 日)|问题 17(1)

📅  最后修改于: 2023-12-03 15:12:45.269000             🧑  作者: Mango

门 | Sudo GATE 2020 Mock III(2019 年 1 月 24 日)|问题 17

这道问题考察了关于图的遍历和判定连通性的知识,下面是一个简介:

图的遍历

在图中找出所有的顶点,也就是进行遍历。有两种常见的遍历方法:

深度优先搜索(DFS)

深度优先搜索从一个起始节点开始,对于每一个与该节点有连接的节点v,遍历完v后再往更深的节点遍历下去。

实现方式可以用递归或者栈来实现。在此基础上,可以实现类似寻找连通块或者拓扑排序的算法。

以下是一个使用邻接矩阵表示图的 DFS 实现的伪代码:

visited = array [0...num_vertices-1] of bool
dfs(i):
    visited[i] = true
    for j in range(num_vertices):
        if (adj_matrix[i][j] == 1 and visited[j] == false):
            dfs(j)
广度优先搜索(BFS)

广度优先搜索从一个起始节点开始,遍历完一个节点的所有邻居节点才接着遍历下一个节点。

实现方式可以用队列来实现。在此基础上,可以实现最短路径等算法。

以下是一个使用邻接表表示图的 BFS 实现的伪代码:

visited = array [0...num_vertices-1] of bool
queue = new queue()
queue.push(s)
while not queue.empty():
    u = queue.front()
    queue.pop()
    visited[u] = true
    for v in adj_list[u]:
        if visited[v] == false:
            visited[v] = true
            queue.push(v)
判定连通性

在图中,如果存在一条从x到y的路径,那么就说x和y是连通的。如果图中所有的节点都可以两两到达,那么这个图就是连通的。

我们可以利用上面的 DFS 或 BFS 来判断图的连通性,具体实现可以参看以下伪代码:

def is_connected(graph):
    visited = array [0...num_vertices-1] of bool
    dfs(start_vertex)
    for i in range(num_vertices):
        if visited[i] == false:
            return false
    return true

以上就是本题涉及到的基本图算法,希望能对您有所帮助。