Day13 bfs 走迷宫 树与图的dfs 树的重心

bfs走迷宫
这个走法有点新奇。。。

不过就是输入有问题。。。我de了半小时

以后要注意检查main函数。。。。

这个bfs计算最短路径步数

采用每一步停下来扩点

这个是用了手写队列,也不难

#include<iostream>

using namespace std;

const int N=105;
typedef pair<int,int> PII;
bool maze[N][N];
PII q[N*N];
int n,m;
int dx[]={0,0,1,-1},dy[]={1,-1,0,0},d[N*N];
int  bfs(){
    int tt=0,hh=0;
    q[0]={0,0};
    maze[0][0]=1; 
    int res=-1,x,y;
    while(hh<=tt){
        res++;
        int size=tt-hh+1;
        for(int j=0;j<size;j++){
            x=q[hh].first,y=q[hh].second;
            hh++;
            
            if(x==n-1&&y==m-1){
                break;
            }
            for(int i=0;i<4;i++){
                int tx=x+dx[i],ty=y+dy[i];
         //       printf("%d %d %d\n",tx,ty,tx>=0&&tx<n&&ty>=0&&ty<m&&maze[i]==0);
                if(tx>=0&&tx<n&&ty>=0&&ty<m&&maze[tx][ty]==0){
              //      printf("res:%d %d %d\n",res,tx,ty);
                    q[++tt]={tx,ty};
                    maze[tx][ty]=1;
                }
            }
        }
        //printf("%d %d\n",hh,tt);
        if(x==n-1&&y==m-1){
            break;
        }
    }
    return res;
    
}

int main(){
    //int n,m;
    scanf("%d%d",&n,&m);
    
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            scanf("%d",&maze[i][j]);
        }
    }
    
//    bfs();
    printf("%d",bfs());
    return 0;
}

树的重心

传送门
一个很有启发性的树的dfs
重心就是去掉树的某个点
使得所有连通块用用的点的最大值最小
那这个点就是树的重心

采用的是计算点的子树的数量,然后再计算此点上的所有点数

很奇特的dfs

注意这个用了st数组所以点是不会往上面走的

#include<iostream>
#include<cstring>

using namespace std;
const int N=1e5+10;

int h[N],e[2*N],ne[2*N],idx;
bool st[N];
void add(int a,int b){
    e[idx]=b;
    ne[idx]=h[a];
    h[a]=idx++;
}
int ans=N,n;
//表示节点为u的子树节点数
int dfs(int u){
    st[u]=1;
    int res=0,sum=1;
    for(int i=h[u];i!=-1;i=ne[i]){
        int j=e[i];
        if(!st[j]){
            int s=dfs(j);
            res=max(res,s);
            sum+=s;
        }
    }
    res=max(res,n-sum);
    ans=min(ans,res);
    return sum;
}

int main(){
    //int n;
    scanf("%d",&n);
    memset(h,-1,sizeof h);
    
    
    for(int i=0;i<n;i++){
        int a,b;
        scanf("%d%d",&a,&b);
        add(a,b);
        add(b,a);
    }
    dfs(1);
    printf("%d",ans);
    return 0;
}

今天太晚了
主要是de沙比题
本来还要写八数码、拓扑排序、图的层次的。。。

彳亍

睡觉

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 一般情况下,BFS生成高要比DFS生成高低。因为BFS生成是按照层次遍历的方式生成的,每一层的节点数都比上一层少,所以的高度相对较低。而DFS生成则是按照深度遍历的方式生成的,可能会出现某一条分支很长的情况,导致的高度相对较高。但是在某些特殊情况下,DFS生成高可能会比BFS生成高低,这取决于的结构和遍历方式。 ### 回答2: BFS(广度优先搜索)生成DFS(深度优先搜索)生成是两种常见的生成算法。它们都是通过遍历中的节点,来生成一棵。但是它们生成的高度不同,主要原因在于它们搜索节点的方式不同。 BFS 生成是按照节点的层级从上到下逐层遍历的,它从起始节点开始,依次遍历当前节点的所有邻居节点,并将这些邻居节点添加到遍历队列的末尾。然后弹出队列的头节点,并以这个节点为起点,依次遍历它的邻居节点,将这些邻居节点添加到队列的末尾,以此类推。这样,搜索到每个节点时,都是以最短路径的方式到达,因此 BFS 生成高通常比 DFS 生成高要高。 DFS 生成是从起点节点开始,对于每个未访问过的邻居节点,递归访问它。当访问完所有的邻居节点后,回溯到上一个节点,直到遍历完所有的节点。因为 DFS 生成是通过深入中的某一方向来遍历节点的,因此生成的会存在极长的分支,这些分支会很快使得高增加。 综上所述,BFS 生成高比 DFS 生成高要高,因为 BFS 生成是按照节点的层级从上到下逐层遍历的,因此每个节点都是以最短路径的方式到达的。而 DFS 生成是深入中的某一分支来遍历节点的,因此很容易存在极长的分支,使得高增加。 ### 回答3: 深度优先搜索(DFS)和广度优先搜索(BFS)是常用的遍历算法,它们都可以生成一棵生成。其中,DFS生成BFS生成高有一定差异。 对于一棵来说,的高度是指从根节点到最深叶子节点的最长路径上所经过的边数。在一个中生成一棵生成,其高也可以这样定义。DFS生成高就是从生成的根节点开始,到生成中最深叶子节点的距离。而BFS生成高则是从生成的根节点开始,到生成中最远节点的距离。 如果将中所有边权值都赋为1,则可以发现,BFS生成高是DFS生成高的上界。这是因为BFS确保了所有边距离根节点的距离相同,因此最远节点就是距离根节点最远的节点。而DFS可能会出现一些子的深度很深,导致整个生成的高度增加。 总体来说,BFS生成高比DFS生成高要小一些。在实际应用中,的高度往往与算法的时间复杂度有关,因此在需要控制时间复杂度的算法中,尽可能使用BFS生成可能会更加有效。但在一些特殊情况下,如需要找到深度最深的节点或者深度为K的所有节点时,DFS生成可能更为合适。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值