广度优先搜索 - 城市交通最短路
【题目描述】
如图,表示的是从城市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