#Z2505. 图的遍历

图的遍历

#include <iostream>
#include <vector>
using namespace std;
vector<int> G[110];

int main() {
    int n, m;
    cin >> n >> m;
    for (int i = 0; i < m; i++) {
        int u, v;
        cin >> u >> v;
        G[u].push_back(v);
        G[v].push_back(u);
    }
  
    return 0;
}

这一节我们来实现一个在无向连通的图上的搜索。

这一节我们用邻接表来存图,因为邻接表更有利于我们去找一个点连接的所有点。

输入部分已经完成,进行图的遍历,就是用搜索访问图上每一个顶点,每一次需要去访问之前没有访问过的点,所以我们需要知道每个点是不是被访问过,我们需要声明一个bool数组的vis记录这个事情。

我们使用 DFS 进行搜索,状态就是当前所在的点,不需要返回值,参数就是当前所在的点 u 。

main函数上边写下

bool vis[110];
void dfs(int u) {

}

对于目前所在的顶点 u ,我们需要标记它已经被访问了。

然后我们可以输出现在访问的这个顶点,一个顶点占一行。

在 dfs 函数里面写下

vis[u] = true;
cout << u << endl;

然后我们去遍历和 u 相连的顶点,继续访问没有访问过的顶点。

在 dfs 函数里面继续写下

for (int i = 0; i < G[u].size(); i++) {
    int v = G[u][i];
    if (!vis[v]) {
        dfs(v);
    }
}

最后,我们只需要调用dfs(1)从 1 号点开始遍历图就可以了。其实如果没有特定要求可以从任意一个点开始,不过大家一般都习惯在这种情况下就从 1 开始了。

main函数里面输入下面写下

dfs(1);

这一节已经完成,点击运行,然后输入下面的数据:

6 6
1 2
1 3
5 4
6 5
3 5
2 5

这就是下面这个图:

1102.png