zoukankan      html  css  js  c++  java
  • bfs/无向图的最短路径算法

    uva,572

    简单dfs题目。

     1 #include <iostream>
     2 #include <cstring>
     3 #include <cstdio>
     4 #include <cstdlib>
     5 
     6 using namespace std;
     7 const int maxn=105;
     8 
     9 char map[maxn][maxn];
    10 int vis[maxn][maxn];
    11 int n,m;
    12 int dx[]={-1,0,-1,-1,0,1,1,1},dy[]={-1,-1,0,1,1,-1,0,1};
    13 
    14 bool check(int x,int y)
    15 {
    16     if(x<0 || x>=m || y<0 || y>=n) return false;
    17     if(vis[x][y]) return false;
    18     if(map[x][y]!='@') return false;
    19     return true;
    20 }
    21 
    22 void dfs(int x,int y)
    23 {
    24     int xx,yy;
    25     vis[x][y]=1;
    26     map[x][y]='#';
    27     for(int i=0;i<8;i++)
    28     {
    29         xx=x+dx[i];
    30         yy=y+dy[i];
    31         if(check(xx,yy))
    32         {
    33             dfs(xx,yy);
    34         }
    35     }
    36     
    37 }
    38 
    39 
    40 int main()
    41 {
    42     while(scanf("%d %d",&m,&n) && n+m)
    43     {
    44         memset(map,0,sizeof(map));
    45         for(int i=0;i<m;i++)
    46             scanf("%s",map[i]);
    47         
    48         memset(vis,0,sizeof(vis));
    49         int cnt=0;
    50         for(int i=0;i<m;i++)
    51             for(int j=0;j<n;j++)
    52             {
    53                 if(!vis[i][j] && map[i][j]=='@')
    54                 {
    55                     dfs(i,j);
    56                     cnt++;
    57                 }
    58             }
    59         printf("%d
    ",cnt);
    60     }
    61     return 0;
    62 }
    View Code

    uva,439

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 
     5 using namespace std;
     6 
     7 struct Node
     8 {
     9     int x,y;
    10     int bu;
    11 }q[11111];
    12 
    13 int dx[]={1,1,-1,-1,2,2,-2,-2},dy[]={2,-2,2,-2,1,-1,1,-1};
    14 int vis[15][15];
    15 int x,y,xx,yy;
    16 char a[3],b[3];
    17 int cnt;
    18 
    19 
    20 bool check(int x,int y)
    21 {
    22     if(x<1 || x>8 || y<1 || y>8) return false;
    23     if(vis[x][y]) return false;
    24     return true;
    25 }
    26 
    27 void bfs(int x,int y)
    28 {
    29     int head=0,tail=0;
    30     q[head].x=x;
    31     q[head++].y=y;
    32     vis[x][y]=1;
    33     for(int i=0;i<11111;i++)
    34         q[i].bu=9999;
    35     q[tail].bu=0;
    36     while(tail!=head)
    37     {
    38         Node t=q[tail++];
    39         Node tt;
    40         for(int i=0;i<8;i++)
    41         {
    42             tt.x=t.x+dx[i];
    43             tt.y=t.y+dy[i];
    44             if(tt.x==xx && tt.y==yy)
    45             {
    46                 cnt=t.bu+1;
    47                 return;
    48             }
    49             if(check(tt.x,tt.y))
    50             {
    51                 vis[tt.x][tt.y]=1;
    52                 tt.bu=t.bu+1;  //应该是求深度。。我一开始直接弄一个cnt++
    53 //弄成求附近有多少步了。。wa了两次
    54                 q[head++]=tt;
    55             }
    56         }
    57     }
    58 }
    59 
    60 int main()
    61 {
    62     while(~scanf("%s%s",a, b))
    63     {
    64         x=a[0]-'a'+1;
    65         y=a[1]-'0';
    66         xx=b[0]-'a'+1;
    67         yy=b[1]-'0';
    68         cnt=0;
    69         if(x==xx && y==yy)
    70             printf("To get from %s to %s takes 0 knight moves.
    ",a,b);
    71         else
    72         {
    73             memset(q,0,sizeof(q));
    74             memset(vis,0,sizeof(vis));
    75             bfs(x,y);
    76             printf("To get from %s to %s takes %d knight moves.
    ",a,b,cnt);
    77         }
    78     }
    79     return 0;
    80 }
    View Code

    uva,417

    注意dfs递归打表,方法好巧妙= =忍不住多写了几遍

    - -再写一遍;

    void dfs(int s,int n,int t)

    {

      if(n==t)

      {

        for(int i=0;i<t;i++)

          answ[Count][i]=save[i];

        answ[Count++][t]=0;
      }

      else

      {

        for(int i=s;i<26;i++)

        {  

          if(!used[i])

          {

            used[i]=1;

            save[n]='a'+i;

            dfs(i+1,n+1,t); 

             used[i]=0;

          }

        }
      }

     1 #include <iostream>
     2 #include <cstdlib>
     3 #include <cstring>
     4 #include <map>
     5 #include <cstdio>
     6 
     7 using namespace std;
     8 
     9 int used[26];
    10 char save[6],data[6];
    11 char answ[83685][6];
    12 int Count=0;
    13 map<string,int> mp;
    14 
    15 void dfs(int s,int n,int t)
    16 {
    17     if(n==t)
    18     {
    19         for(int i=0;i<t;i++)
    20             answ[Count][i]=save[i];
    21         answ[Count++][t]=0;
    22     }
    23     else
    24     {
    25         for(int i=s;i<26;i++)
    26         {
    27             if(!used[i])
    28             {
    29                 used[i]=1;
    30                 save[n]=i+'a';
    31                 dfs(i+1,n+1,t);
    32                 used[i]=0;
    33             }
    34         }
    35     }
    36 }
    37 
    38 int main()
    39 {
    40     Count=1;
    41     for(int i=1;i<6;i++)
    42         dfs(0,0,i);
    43     for(int i=1;i<Count;++i)
    44     {
    45         string s=answ[i];
    46         mp[s]=i;
    47     }
    48     while(cin>>data)
    49     {
    50         cout<<mp[data]<<endl;
    51     }
    52     return 0;
    53 }
    View Code

    uva,352

     1 #include <iostream>
     2 #include <cstring>
     3 #include <cstdio>
     4 #include <cstdlib>
     5 
     6 using namespace std;
     7 const int maxn=105;
     8 
     9 char map[maxn][maxn];
    10 int vis[maxn][maxn];
    11 int n;
    12 int dx[]={-1,0,-1,-1,0,1,1,1},dy[]={-1,-1,0,1,1,-1,0,1};
    13 
    14 bool check(int x,int y)
    15 {
    16     if(x<0 || x>=n || y<0 || y>=n) return false;
    17     if(vis[x][y]) return false;
    18     if(map[x][y]!='1') return false;
    19     return true;
    20 }
    21 
    22 void dfs(int x,int y)
    23 {
    24     int xx,yy;
    25     vis[x][y]=1;
    26     map[x][y]=0;  //记得标记
    27     for(int i=0;i<8;i++)
    28     {
    29         xx=x+dx[i];
    30         yy=y+dy[i];
    31         if(check(xx,yy))
    32         {
    33             dfs(xx,yy);
    34         }
    35     }
    36     
    37 }
    38 
    39 
    40 int main()
    41 {
    42     int test=1;
    43     while(~scanf("%d",&n) && n)
    44     {
    45         memset(map,0,sizeof(map));
    46         for(int i=0;i<n;i++)
    47             scanf("%s",map[i]);
    48         
    49         memset(vis,0,sizeof(vis));
    50         int cnt=0;
    51         for(int i=0;i<n;i++)
    52             for(int j=0;j<n;j++)
    53             {
    54                 if(!vis[i][j] && map[i][j]=='1')
    55                 {
    56                     dfs(i,j);
    57                     cnt++;
    58                 }
    59             }
    60         printf("Image number %d contains %d war eagles.
    ",test++,cnt);
    61     }
    62     return 0;
    63 }
    View Code

    uva,336

    一开始一根筋想用dfs解出来,因为就30个点

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <map>
     5 #include <vector>
     6 #include <algorithm>
     7 #include <cmath>
     8 #include <queue>
     9 using namespace std;
    10 
    11 vector<int> vt[32];
    12 map<int,int> mp;
    13 int dis[32];
    14 
    15 void dfs(int node,int dp)
    16 {
    17     if(!dp)
    18         return;
    19     for(int i=0;i<vt[node].size();i++)
    20     {
    21         if(!dis[vt[node][i]])
    22         {
    23             dis[vt[node][i]]=1;
    24             dfs(vt[node][i],dp-1);
    25         }
    26     }
    27 }
    28 
    29 
    30 int main()
    31 {
    32     int nc;
    33     int x,y,c;
    34     int st;
    35     int t=1;
    36     int cnt;
    37     int strt,ttl;
    38     while(scanf("%d",&nc) && nc)
    39     {
    40         int a,b;
    41         mp.clear();
    42         c=0;
    43         for(int i=0;i<nc;i++)
    44         {
    45             scanf("%d %d",&a,&b);
    46             if(mp.find(a)!=mp.end())
    47                 x=mp[a];
    48             else
    49             {
    50                 mp[a]=++c;
    51                 x=c;
    52             }
    53             if(mp.find(b)!=mp.end())
    54                 y=mp[b];
    55             else
    56             {
    57                 mp[b]=++c;
    58                 y=c;
    59             }
    60             vt[x].push_back(y);
    61             vt[y].push_back(x);
    62         }
    63         
    64         while(scanf("%d %d",&strt,&ttl) && strt+ttl)
    65         {
    66             memset(dis,0,sizeof(dis));
    67             st=mp[strt];
    68             cnt=0;
    69             dis[st]=1;
    70             dfs(st,ttl);
    71             for(int i=1;i<=c;i++)
    72             {
    73                 if(!dis[i])
    74                     cnt++;
    75             }
    76             printf("Case %d: %d nodes not reachable from node %d with TTL = %d.
    ",t++,cnt,strt,ttl);
    77         }
    78         for(int i=1;i<=c;i++)
    79             vt[i].clear();
    80     }
    81     return 0;
    82 }
    dfs代码,wa了三小时,找不出原因

    用bfs重写了,把每个节点的深度打表,没有访问到的节点和深度大于给定节点的都是不可达的。

    map映射感觉写的好赞

    搜点具体那个点到点用dfs,铺面用bfs做

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <map>
     5 #include <vector>
     6 #include <algorithm>
     7 #include <cmath>
     8 #include <queue>
     9 using namespace std;
    10 
    11 vector<int> vt[32];
    12 map<int,int> mp;
    13 int dis[32];
    14 queue<int> q;
    15 
    16 void bfs()
    17 {
    18     int node;
    19     while(!q.empty())
    20     {
    21         node=q.front();
    22         q.pop();
    23         
    24         for(int i=0;i<vt[node].size();i++)
    25         {
    26             if(dis[vt[node][i]]==-1)
    27             {
    28                 dis[vt[node][i]]=dis[node]+1;
    29                 q.push(vt[node][i]);
    30             }
    31         }
    32     }
    33     return;
    34 }
    35 
    36 
    37 int main()
    38 {
    39     int nc;
    40     int x,y,c;
    41     int st;
    42     int t=1;
    43     int cnt;
    44     int strt,ttl;
    45     while(scanf("%d",&nc) && nc)
    46     {
    47         int a,b;
    48         mp.clear();
    49         c=0;
    50         for(int i=0;i<nc;i++)
    51         {
    52             scanf("%d %d",&a,&b);
    53             if(mp.find(a)!=mp.end())
    54                 x=mp[a];
    55             else
    56             {
    57                 mp[a]=++c;
    58                 x=c;
    59             }
    60             if(mp.find(b)!=mp.end())
    61                 y=mp[b];
    62             else
    63             {
    64                 mp[b]=++c;
    65                 y=c;
    66             }
    67             vt[x].push_back(y);
    68             vt[y].push_back(x);
    69         }
    70         
    71         while(scanf("%d %d",&strt,&ttl) && strt+ttl)
    72         {
    73             memset(dis,-1,sizeof(dis));
    74             st=mp[strt];
    75             cnt=0;
    76             dis[st]=0;
    77             q.push(st);
    78             bfs();
    79             for(int i=1;i<=c;i++)
    80             {
    81                 if(dis[i]==-1 || dis[i]>ttl)
    82                     cnt++;
    83             }
    84             printf("Case %d: %d nodes not reachable from node %d with TTL = %d.
    ",t++,cnt,strt,ttl);
    85         }
    86         for(int i=1;i<=c;i++)
    87             vt[i].clear();
    88     }
    89     return 0;
    90 }
    View Code

    uva,532

    挺简单的bfs题目,只是有几个点该注意

      1 #include <iostream>
      2 #include <cstdio>
      3 #include <cstring>
      4 using namespace std;
      5 
      6 struct Node
      7 {
      8     int x,y,z;
      9 }q[30000];  //注意数组越界
     10 
     11 int dxyz[6][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}};
     12 
     13 char map[32][32][32];
     14 int L,R,C;
     15 int x2,y2,z2;
     16 int x1,y1,z1;
     17 int vis[32][32][32];
     18 int dir[32][32][32];
     19 bool flag;
     20 
     21 bool check(int x,int y,int z)
     22 {
     23     if(x<0 || x>=L || y<0 || y>=R || z<0 || z>=C) return false;
     24     if(vis[x][y][z]) return false;
     25     if(map[x][y][z]!='.') return false;
     26     return true;
     27 }
     28 
     29 
     30 void bfs(int x,int y,int z)
     31 {
     32     int tail=0,head=0;
     33     q[head].x=x;
     34     q[head].y=y;
     35     q[head++].z=z;
     36     vis[0][0][0]=1;
     37     while(tail!=head)
     38     {
     39         Node t=q[tail++];
     40         Node tt;
     41         for(int i=0;i<6;i++)
     42         {
     43             tt.x=t.x+dxyz[i][0];
     44             tt.y=t.y+dxyz[i][1];
     45             tt.z=t.z+dxyz[i][2];
     46             if(tt.x==x2 && tt.y==y2 && tt.z==z2)
     47             {
     48                 dir[tt.x][tt.y][tt.z]=dir[t.x][t.y][t.z]+1;
     49                 flag=true;
     50                 return;
     51             }
     52             if(check(tt.x,tt.y,tt.z))
     53             {
     54                 dir[tt.x][tt.y][tt.z]=dir[t.x][t.y][t.z]+1;
     55                 vis[tt.x][tt.y][tt.z]=1;
     56                 q[head++]=tt;
     57             }
     58         }
     59     }
     60 }
     61 
     62 int main()
     63 {
     64     while(scanf("%d %d %d",&L,&R,&C) && L+R+C)
     65     {
     66         getchar();
     67         memset(map,0,sizeof(map));
     68         for(int i=0;i<L;i++)
     69         {
     70             for(int j=0;j<R;j++)
     71             {
     72                 scanf("%s",map[i][j]);
     73                 for(int k=0;k<C;k++)
     74                 {
     75                     if(map[i][j][k]=='S')  //纪录起点,wa了几次。
     76                     {
     77                         x1=i;
     78                         y1=j;
     79                         z1=k;
     80                     }
     81                     if(map[i][j][k]=='E') //纪录终点,runtime error了几次
     82                     {
     83                         x2=i;
     84                         y2=j;
     85                         z2=k;
     86                     }
     87                 }
     88             }
     89             getchar();
     90         }
     91         memset(vis,0,sizeof(vis));
     92         memset(dir,0,sizeof(dir));
     93         flag=false;
     94         bfs(x1,y1,z1);
     95         if(flag)
     96             printf("Escaped in %d minute(s).
    ",dir[x2][y2][z2]);
     97         else
     98             printf("Trapped!
    ");
     99     }
    100     return 0;
    101 }
    View Code
    活在现实,做在梦里。
  • 相关阅读:
    尚硅谷Docker笔记(6) DockerFile解析
    注意防踩坑系列
    尚硅谷Docker笔记(1) Docker简介
    尚硅谷Docker笔记(4) Docker 镜像
    尚硅谷Docker笔记(8) 本地镜像发布到阿里云
    尚硅谷Docker笔记(2) Docker安装
    SQL中join连接查询时条件放在on后与where后的区别
    尚硅谷Docker笔记(3) Docker常用命令
    尚硅谷Docker笔记(7) Docker常用软件安装
    关于存储过程的几个sql
  • 原文地址:https://www.cnblogs.com/do-it-best/p/5389585.html
Copyright © 2011-2022 走看看