DFS,BFS的连通性

简介: DFS,BFS的连通性

1.全球变暖 - 蓝桥云课 (lanqiao.cn)

dfs

1.从图上任意一个点u开始遍历,标记u已经被搜索过

2.递归点u的所有符合连通条件的邻居点

3.递归结束,找到了与点u联通的所有点,这是一个连通块

4.不与点u联通的,其他没有访问的点,继续用上述步骤处理,知道找到所有的连通块

#include<iostream>
#include<cstring>
#include<algorithm>
 
using namespace std ;
const int N = 2000 ;
int d[4][2] = {{0,1},{1,0},{0,-1},{-1,0}} ;
char mp[N][N] ;
int v[N][N];
int flag ,ans ;
 
void dfs(int x,int y){
    v[x][y] = 1 ;
    
    if(mp[x+1][y] == '#'&&mp[x-1][y] == '#'&&mp[x][y+1] == '#'&&mp[x][y-1] == '#') 
        flag = 1 ;//这个连通块可以不被淹没
    for(int i = 0 ; i< 4 ; i++){
        int tx = x + d[i][0] , ty = y + d[i][1] ;
        if(v[tx][ty] == 0 && mp[tx][ty] == '#'){//两个条件一个都不能少,如果不判断v那将进入死循环
            dfs(tx,ty) ;
        }
    }
}
 
int main(){
    int n ; cin >> n ;
    for(int i = 0 ; i < n ; i ++) cin >> mp[i] ;
    //每一个点进入循环
    for(int i = 0 ; i < n ; i ++){
        for(int j = 0 ; j < n ; j ++){
            if(mp[i][j] == '#' && v[i][j] == 0) {
                flag = 0 ;
                dfs(i,j) ;
                if(!flag) ans ++ ;
            }
            
        }
    }
    cout << ans << endl ;
    return 0 ;
}

bfs:


1.从图上任意一个点u开始遍历,把它放进队列中


2.弹出对手u,标记点u已经被搜索过,然后搜索点u的邻居点,即与点u连通的点,将其放到队列中


3.弹出队首,标记为已经被搜索过,然后搜索与他连通的邻居点,放进队列


继续以上步骤,直到队列为空,此时已经找到了一个连通块。其他没有访问到的点,属于另外的连通块,按以上步骤再次处理这些点。最后所有点都被搜索过,所有连通块都找到了。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std ;
const int N = 2000 ;
int d[4][2] = {{0,1},{1,0},{-1,0},{0,-1}} ;
bool v[N][N] ;
char mp[N][N] ;
int flag , ans ;
void bfs(int x, int y){
  v[x][y] = 1 ;
  pair<int,int> a = {x,y} ;
  queue<pair<int,int>> q ;q.push(a) ;
  
  while(!q.empty()){
    pair<int,int> now = q.front() ;
    q.pop() ;
    int x1 = now.first , y1 = now.second ;
    if(mp[x1+1][y1] == '#' &&mp[x1-1][y1] == '#' &&mp[x1][y1+1] == '#' &&mp[x1][y1-1] == '#' ) flag = 1 ;
    for(int i = 0 ; i < 4 ; i ++){
      int tx = now.first + d[i][0] , ty = now.second + d[i][1] ;
      if(v[tx][ty]==0 && mp[tx][ty] =='#') {
        bfs(tx,ty) ;
      }
    }
  }
}
 
int main(){
  int n; cin >> n ;
  for(int i = 0 ; i < n ; i ++) cin >> mp[i] ;
  for(int i = 0 ; i < n ; i ++){
    for(int j = 0 ; j < n ;j ++){
      if(v[i][j] == 0 && mp[i][j] == '#') {
        flag = 0 ;
        bfs(i,j) ;
        if(!flag) ans ++ ;
      }
    }
  }
  cout << ans << endl ;
}
目录
相关文章
|
6月前
|
算法
深度优先搜索(DFS)的基础理解与实现
深度优先搜索(DFS)的基础理解与实现
84 0
|
算法
DFS and BFS
DFS and BFS
49 0
DFS(深度优先搜索)和BFS(宽度优先搜索)
DFS(深度优先搜索)和BFS(宽度优先搜索)
79 0
|
算法
DFS深度优先搜索
DFS深度优先搜索
|
算法
浅谈递归回溯DFS和BFS
前言 我们在解题的过程中经常遇到各种题型的分类,其中有几类是经常交替出现或者同时出现的 递归 回溯 DFS BFS
|
算法
【和zqy学算法】Day1:DFS与BFS
【和zqy学算法】Day1:DFS与BFS
152 0
|
存储 算法 PHP
深度优先搜索(DFS)
深度优先搜索(DFS)
238 0
深度优先搜索(DFS)
|
算法
图的深度优先搜索(DFS)的应用--马踏棋盘问题(骑士周游问题)
图的深度优先搜索(DFS)的应用--马踏棋盘问题(骑士周游问题)
104 0
|
存储 C++
C++实现图 - 02 图的遍历(DFS、BFS)
上一讲我们对图有了一个大概的了解,但是只讲了如何存储图,还没有讲如何遍历图。这一讲我们来介绍图的遍历方式,一共分为深度优先搜索(DFS)和宽度优先搜索(BFS)。
529 0
C++实现图 - 02 图的遍历(DFS、BFS)
|
算法
DFS之连通性模型
复习acwing算法提高课的内容,本篇为讲解算法:DFS之连通性模型,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。
97 0
DFS之连通性模型