图的遍历

基本概念

从给定图中任意指定的顶点(称为初始点)出发,按照某种搜索方法沿着图的边访问图中的所有顶点,使每个顶点仅被访问一次,这个过程称为图的遍历。如果给定图是连通的无向图或者是强连通的有向图,则遍历过程一次就能完成,并可按访问的先后顺序得到由该图所有顶点组成的一个序列。

根据搜索方法的不同,图的遍历方法有两种:一种叫做深度优先搜索法(DFS);另一种叫做广度优先搜索法(BFS)。

深度优先搜索

深度优先搜索遍历类似于树的先序遍历。假定给定图G的初态是所有顶点均未被访问过,在G中任选一个顶点i作为遍历的初始点,则深度优先搜索遍历可定义如下:、

①首先访问顶点i,并将其访问标记置为访问过,即visited[i]=1;
②然后搜索与顶点i有边相连的下一个顶点j,若j未被访问过,则访问它,并将j的访问标记置为访问过,visited[j]=1,然后从j开始重复此过程,若j已访问,再看与i有边相连的其它顶点;
③若与i有边相连的顶点都被访问过,则退回到前一个访问顶点并重复刚才过程,直到图中所有顶点都被访问完止。

深搜的邻接矩阵实现:

代码:

// 输入
int N, M;
char field[MAX_N][MAX_M + 1]; // 图
// 现在位置(x,y)
void dfs(int x, int y) {
    // 将现在所在位置替换为.
    field[x][y] = '.';
    // 循环遍历移动的8个方向
    for (int dx = -1; dx <= 1; dx++) {
        for (int dy = -1; dy <= 1; dy++) {
            // 向x方向移动dx,向y方向移动dy,移动的结果为(nx,ny)
            int nx = x + dx, ny = y + dy;
            // 判断(nx,ny)是不是在园子内,以及是否有积水
            if (0 <= nx && nx < N && 0 <= ny && ny < M && field[nx][ny] == 'W') dfs(nx, ny);
        }
    }
    return ;
}
void solve() {
    int res = 0;
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                if (field[i][j] == 'W') {
                    // 从有W的地方开始dfs
                    dfs(i, j);
                    res++;
                }
            }
        }
    printf("%d\n", res);
}

邻接表实现:

代码1:

//返回v的第一个邻接顶点的序号,若顶点在G中没有邻接顶点,则返回-1

int FirstAdjVex(MGraph G,string V)
{
    int i=LocateVex(G,V);        // i为顶点V在图G中的序号
       for(int j=0;j<G.vexnum;++j)
        if(G.arcs[i][j]!=0 and G.arcs[i][j]!
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值