广度优先搜索 - 城市交通最短路

【题目描述】

如图,表示的是从城市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 }

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

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

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

猜你喜欢

转载自www.cnblogs.com/tyqEmptySet/p/9481271.html