zoukankan      html  css  js  c++  java
  • 广度优先搜索

    【题目描述】

    如图,表示的是从城市A到城市H的交通图。从图中可以看出,从城市A到城市H要经过若干个城市。现要找出一条经过城市最少的一条路线。

    【输出样例】

    H——F——A

    【算法分析】

    用邻接矩阵来表示,0能走,1不能走。

    本图出自《信息学奥赛一本通》

    【算法分析】

     1 //代码来源:《信息学奥赛一本通》!!
     2 #include <iostream>
     3 #include <cstring>
     4 using namespace std;
     5 int ju[9][9]={{0,0,0,0,0,0,0,0,0},
     6               {0,1,0,0,0,1,0,1,1},
     7               {0,0,1,1,1,1,0,1,1},
     8               {0,0,1,1,0,0,1,1,1},
     9               {0,0,1,0,1,1,1,0,1},
    10               {0,1,1,0,1,1,1,0,0},
    11               {0,0,0,1,1,1,1,1,0},
    12               {0,1,1,1,0,0,1,1,0},
    13               {0,1,1,1,1,0,0,0,1}};
    14 int a[101],b[101];
    15 bool s[9];
    16 void out(int d)
    17 {
    18     cout<<char(a[d]+64);
    19     while(b[d])
    20     {
    21         d=b[d];
    22         cout<<"——"<<char(a[d]+64);
    23     }
    24     cout<<endl;
    25 }
    26 
    27 void doit()
    28 {
    29     int head,tail,i;
    30     head=0;tail=1;                          //队首为0、队尾为1
    31     a[1]=1;                                 //记录经过的城市
    32     b[1]=0;                                 //记录前趋城市
    33     s[1]=1;                                 //表示该城市已经到过
    34     do                                      //步骤2
    35     {
    36         head++;                               //队首加一,出队
    37         for (i=1;i<=8;i++)                    //搜索可直通的城市
    38         if ((ju[a[head]][i]==0)&&(s[i]==0))  //判断城市是否走过
    39         {
    40             tail++;                           //队尾加一,入队
    41             a[tail]=i;
    42             b[tail]=head;
    43             s[i]=1;
    44             if (i==8)
    45             {
    46                 out(tail);
    47                 head=tail;
    48                 break;   //第一次搜到H城市时路线最短
    49             }
    50         }
    51     }while (head<tail);
    52 }
    53 
    54 int main()                                 //主程序
    55 {
    56     memset(s,false,sizeof(s));
    57     doit();                                  //进行Bfs操作
    58     return 0;
    59 }

    代码来源:《信息学奥赛一本通》!

    代码来源:《信息学奥赛一本通》!!

    代码来源:《信息学奥赛一本通》!!!

    作者:tyqEmptySet
  • 相关阅读:
    C++复制构造函数,类型转换构造函数,析构函数,引用,指针常量和常量指针
    POJ1611(The Suspects)--简单并查集
    最小生成树-Kruskal算法
    POJ1861(Network)-Kruskal
    POJ1979(Red and Black)--FloodFill
    [转]全网最!详!细!tarjan算法讲解
    POJ1573(Robot Motion)--简单模拟+简单dfs
    最小生成树-Prim算法
    POJ3368(Frequent values)--线段树
    POJ3255(Roadblocks)--次短路径
  • 原文地址:https://www.cnblogs.com/tyqEmptySet/p/9481271.html
Copyright © 2011-2022 走看看