zoukankan      html  css  js  c++  java
  • bfs 学习笔记

    BFS是一种借用队列来存储的过程,分层查找,优先考虑距离出发点近的点。无论是在邻接表还是邻接矩阵中存储,都需要借助一个辅助队列,v个顶点均需入队,最坏的情况下,空间复杂O(v)。
    邻接表形式存储时,每个顶点均需搜索一次,时间复杂度T1=O(v),从一个顶点开始搜索时,开始搜索,访问未被访问过的节点。最坏的情况下,每个顶点至少访问一次,每条边至少访问1次,这是因为在搜索的过程中,若某结点向下搜索时,其子结点都访问过了,这时候就会回退,故时间复 杂度为O(E),算法总的时间复 度为O(|V|+|E|)。
    邻接矩阵存储方式时,查找每个顶点的邻接点所需时间为O(V),即该节点所在的该行该列。又有n个顶点,故算总的时间复杂度为O(|V|^2)。

    模版题 POJ 2251 三维BFS

    https://vjudge.net/contest/65959#problem/B

    #include<queue>
    #include<cmath>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int L,R,C,step;
    char tmp[33][33][33];
    bool map[33][33][33],vis[33][33][33];
    struct Point{
      int l,r,c,step;
    }S,E,now,Next;
    int dl[]={-1,1,0,0,0,0};
    int dr[]={0,0,0,0,-1,1};
    int dc[]={0,0,-1,1,0,0};
    int bfs(){
      queue<Point>Q;
      step=0;
      Q.push(S);
      vis[S.l][S.r][S.c]=1;
      while(!Q.empty()){
        now=Q.front();
        Q.pop();
        if(now.l==E.l&&now.r==E.r&&now.c==E.c)return now.step;
        for(int i=0;i<6;i++){
          Next.l=now.l+dl[i],Next.r=now.r+dr[i],Next.c=now.c+dc[i],Next.step=now.step+1;
          if(!map[Next.l][Next.r][Next.c]&&!vis[Next.l][Next.r][Next.c]){
    	Q.push(Next);
    	vis[Next.l][Next.r][Next.c]=1;
          }
        }
      }
      return -1;
    }
    int main(){
      while(scanf("%d%d%d",&L,&R,&C)&&L!=0){
        memset(tmp,0,sizeof(tmp));
        memset(map,1,sizeof(map));
        memset(vis,0,sizeof(vis));
        for(int i=1;i<=L;i++)
          for(int j=1;j<=R;j++)
    	for(int k=1;k<=C;k++)
    	  cin>>tmp[i][j][k];
         for(int i=1;i<=L;i++)
           for(int j=1;j<=R;j++)
    	 for(int k=1;k<=C;k++){
    	   map[i][j][k]=(tmp[i][j][k]=='#');
    	   if(tmp[i][j][k]=='S') S.l=i,S.r=j,S.c=k,S.step=0;
    	   if(tmp[i][j][k]=='E') E.l=i,E.r=j,E.c=k;
    	 }
         int Ans=bfs();
         if(Ans==-1)cout<<"Trapped!"<<endl;
         else printf("Escaped in %d minute(s).
    ",Ans);
       }
      
    }
    
    

    模版题 POJ 3278 Catch the cow

    https://vjudge.net/problem/POJ-3278
    这个的边界判断真的鬼屎,一定要判断边界,要不然会runtime error!

    #include<queue>
    #include<cmath>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    #define maxk 100000
    int n,k;
    struct Object{
      int x,step;
    }Now,Next;
    bool vis[100005];
    queue<Object> Q;
    int main(){
      scanf("%d%d",&n,&k);
      if(n>k){
        cout<<abs(n-k)<<endl;
        return 0;
      }
      Now.step=0;
      Now.x=n;
      vis[n]=1;
      Q.push(Now);
      while(!Q.empty()){
        Now=Q.front();Q.pop();
        if(Now.x==k){
          cout<<Now.step<<endl;
          return 0;
        }
        if(Now.x+1>=0&&Now.x+1<=maxk&&!vis[Now.x+1]){
          Next.x=Now.x+1;
          vis[Next.x]=1;
          Next.step=Now.step+1;
          Q.push(Next);
        }
        if(Now.x-1>=0&&Now.x-1<=maxk&&!vis[Now.x-1]){
          Next.x=Now.x-1;
          vis[Next.x]=1;
          Next.step=Now.step+1;
          Q.push(Next);
        }
        if(Now.x*2>=0&&Now.x*2<=maxk&&!vis[Now.x*2]){
          Next.x=Now.x*2;
          vis[Next.x]=1;
          Next.step=Now.step+1;
          Q.push(Next);
        }
      }
    }
    
    
  • 相关阅读:
    php ReflectionObject类
    is_callable
    Zend Framework: Accessing Request, Response & Router Object from anywhere
    (转)zend异常处理
    call_user_func
    zend framework基础教程6—视图
    php func_get_arg
    zend framework基础教程3—创建index.php
    【算法02】3种方法求解斐波那契数列
    【算法01】寻找丑数
  • 原文地址:https://www.cnblogs.com/KingBenQi/p/12305899.html
Copyright © 2011-2022 走看看