1. 程式人生 > >bfs求最短路的幾道例題

bfs求最短路的幾道例題

情況 map 加權 while [] insert dir end void

題目來自於記蒜客數據結構課,類型差不多,都是用bfs求最短路(註意是不加權的最短路,加權的情況後面的文章會講)。

代碼如下:

  1 //記蒜客習題
  2 //bfs求某點到其他各點的最短距離
  3 #include <iostream>
  4 #include <cstring>
  5 #include <queue>
  6 using namespace std;
  7 
  8 class Graph{
  9 private:
 10     int n;
 11     bool *visited;
 12     int **mat;
 13
int *distance; 14 public: 15 Graph(int input_n){ 16 n=input_n; 17 visited=new bool[n]; 18 memset(visited,0,n); 19 mat=new int*[n]; 20 for(int i=0;i<n;i++){ 21 mat[i]=new int[n]; 22 memset(mat[i],0,sizeof(int)*n); 23 }
24 distance=new int[n]; 25 memset(distance,0,sizeof(int)*n); 26 } 27 28 ~Graph(){ 29 delete[] visited; 30 for(int i=0;i<n;i++){ 31 delete[] mat[i]; 32 } 33 delete[] mat; 34 delete[] distance; 35 } 36 37
void insert(int x, int y){ 38 mat[x-1][y-1]=1; 39 mat[y-1][x-1]=1; 40 } 41 42 void calculate(int start_ver){ 43 int cur_ver; 44 int start=start_ver-1; 45 queue<int> temp; 46 temp.push(start); 47 visited[start]=true; 48 while(!temp.empty()){ 49 cur_ver=temp.front(); 50 temp.pop(); 51 for(int adj=0;adj<n;adj++){ 52 if(!visited[adj] && mat[cur_ver][adj]==1){ 53 distance[adj]=distance[cur_ver]+1; 54 temp.push(adj); 55 visited[adj]=true; 56 } 57 } 58 } 59 } 60 61 void print_dis(){ 62 for(int i=0;i<n;i++){ 63 cout<<distance[i]<<endl; 64 } 65 } 66 67 }; 68 69 int main(){ 70 int n,m,a,b,start; 71 cin>>n>>m>>start; 72 Graph g(n); 73 for(int i=0;i<m;i++){ 74 cin>>a>>b; 75 g.insert(a,b); 76 } 77 g.calculate(start); 78 g.print_dis(); 79 } 80 81 82 83 84 85 86 87 //迷宮中的英雄 88 #include <iostream> 89 #include <queue> 90 #include <cstring> 91 using namespace std; 92 93 int n,m,t,sx,sy,px,py; 94 95 struct step{ 96 int x, y, dis=0; 97 }; 98 99 char map[100][100]; 100 int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; 101 int visited[100][100]; 102 103 void bfs(){ 104 queue<step> Q; 105 step cur,temp; 106 cur.x=sx; 107 cur.y=sy; 108 cur.dis=0; 109 Q.push(cur); 110 visited[sx][sy]=1; 111 while(!Q.empty()){ 112 cur=Q.front(); 113 Q.pop(); 114 115 if(cur.dis>t){ 116 break; 117 } 118 119 if(cur.x==px&&cur.y==py){ 120 cout<<"YES"<<endl; 121 return; 122 } 123 124 for(int i=0;i<4;i++){ 125 temp.x=cur.x+dir[i][0]; 126 temp.y=cur.y+dir[i][1]; 127 if(temp.x>=0 && temp.x<m && temp.y>=0 && temp.y<n && map[temp.x][temp.y]!=* && visited[temp.x][temp.y]==0){ 128 temp.dis=cur.dis+1; 129 Q.push(temp); 130 visited[temp.x][temp.y]=1; 131 } 132 } 133 } 134 cout<<"NO"<<endl; 135 } 136 137 138 int main(){ 139 while(cin>>n>>m>>t){ 140 if(n==0&&m==0&&t==0){ 141 break; 142 } 143 memset(map,0,sizeof(map)); 144 memset(visited,0,sizeof(visited)); 145 for(int i=0;i<m;i++){ 146 for(int j=0;j<n;j++){ 147 cin>>map[i][j]; 148 if(map[i][j]==S){ 149 sx=i; 150 sy=j; 151 } 152 if(map[i][j]==P){ 153 px=i; 154 py=j; 155 } 156 } 157 } 158 bfs(); 159 } 160 return 0; 161 } 162 163 164 165 166 167 168 169 //bfs 解騎馬走江湖 170 #include <iostream> 171 #include <queue> 172 #include <cstring> 173 using namespace std; 174 175 struct point{ 176 int x,y,step; 177 }; 178 179 char map[105][105]; 180 bool visited[105][105]; 181 int height,width,Xstart,Ystart,Xend,Yend; 182 int dir[8][2]={{-2,1},{-2,-1},{2,1},{2,-1},{-1,-2},{1,-2},{-1,2},{1,2}}; 183 int horse_leg[8][2]={{-1,0},{-1,0},{1,0},{1,0},{0,-1},{0,-1},{0,1},{0,1}}; 184 185 186 int bfs(queue<point> Q){ 187 int Xblcok,Yblock; 188 int x=Xstart; 189 int y=Ystart; 190 Q.push(point{x,y,0}); 191 visited[x][y]=1; 192 while(!Q.empty()){ 193 point cur=Q.front(); 194 if(cur.x==Xend&&cur.y==Yend){ 195 return cur.step; 196 } 197 for(int i=0;i<8;i++){ 198 x=cur.x+dir[i][0]; 199 y=cur.y+dir[i][1]; 200 Xblcok=cur.x+horse_leg[i][0]; 201 Yblock=cur.y+horse_leg[i][1]; 202 if(x>=0&&x<height&&y>=0&&y<width&&map[x][y]!=#&&map[Xblcok][Yblock]!=#&&!visited[x][y]){ 203 Q.push({x,y,cur.step+1}); 204 visited[x][y]=1; 205 } 206 } 207 Q.pop(); 208 } 209 return -1; 210 } 211 212 213 int main(){ 214 while(cin>>height>>width){ 215 queue<point> Q; 216 memset(visited,0,sizeof(visited)); 217 for(int i=0;i<height;i++){ 218 for(int j=0;j<width;j++){ 219 cin>>map[i][j]; 220 if(map[i][j]==s){ 221 Xstart=i; 222 Ystart=j; 223 } 224 if(map[i][j]==e){ 225 Xend=i; 226 Yend=j; 227 } 228 } 229 } 230 cout<<bfs(Q)<<endl; 231 } 232 return 0; 233 }

bfs求最短路的幾道例題