bfs(同一最短路径)
Posted nonames
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bfs(同一最短路径)相关的知识,希望对你有一定的参考价值。
http://oj.jxust.edu.cn/contest/Problem?id=1702&pid=7
题意:现在有两个相同大小的地图,左上角为起点,右下角问终点。问是否存在同一条最短路径。最短距离一样,他们走的路径也一样。
n 行 m 列(1 <= n , m <= 500)
存在就输出YES , 否则NO;
解法:三个bfs (其中一个是合并的图),判断三个最短路径是否相等且不为-1(不存在)。
//#include <bits/stdc++.h> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <iostream> #include <string> #include <stdio.h> #include <queue> #include <stack> #include <map> #include <set> #include <string.h> #include <vector> #define ME(x , y) memset(x , y , sizeof(x)) #define SF(n) scanf("%d" , &n) #define rep(i , n) for(int i = 0 ; i < n ; i ++) #define INF 0x3f3f3f3f #define mod 20191117 #define PI acos(-1) using namespace std; typedef long long ll ; char s[509][509] , str[509][509]; int vis[509][509]; int dir[4][2] = {{1 , 0} , {-1 , 0} , {0 , 1} , {0 , -1}}; int n , m ; struct node { int x , y , w ; }; int bfs1(int x , int y , int w) { node a , b ; a.x = x , a.y = y , a.w = w ; queue<node>q; q.push(a); vis[x][y] = 1 ; while(!q.empty()) { a = q.front(); q.pop(); if(a.x == n - 1 && a.y == m -1) { return a.w ; } for(int i = 0 ; i < 4 ; i++) { b.x = a.x + dir[i][0]; b.y = a.y + dir[i][1]; b.w = a.w + 1 ; if(b.x < 0 || b.x >= n || b.y < 0 || b.y >= m || vis[b.x][b.y] || s[b.x][b.y] == ‘#‘) { continue ; } vis[b.x][b.y] = 1 ; q.push(b); } } return -1; } int bfs2(int x , int y , int w) { node a , b ; a.x = x , a.y = y , a.w = w ; queue<node>q; q.push(a); vis[x][y] = 1 ; while(!q.empty()) { a = q.front(); q.pop(); if(a.x == n - 1 && a.y == m -1) { return a.w ; } for(int i = 0 ; i < 4 ; i++) { b.x = a.x + dir[i][0]; b.y = a.y + dir[i][1]; b.w = a.w + 1 ; if(b.x < 0 || b.x >= n || b.y < 0 || b.y >= m || vis[b.x][b.y] || str[b.x][b.y] == ‘#‘) { continue ; } vis[b.x][b.y] = 1 ; q.push(b); } } return -1; } int main() { scanf("%d%d" , &n , &m); for(int i = 0 ; i < n ; i++) { for(int j = 0 ; j < m ; j++) { cin >> s[i][j] ; } } int ans1 = bfs1(0 , 0 , 0); for(int i = 0 ; i < n ; i++) { for(int j = 0 ; j < m ; j++) { cin >> str[i][j]; if(str[i][j] == ‘#‘ && s[i][j] == ‘*‘) { s[i][j] = ‘#‘; } } } memset(vis , 0 , sizeof(vis)); int ans2 = bfs2(0 , 0 , 0) ; memset(vis , 0 , sizeof(vis)); int ans3 = bfs1(0 , 0 , 0) ; if(ans1 == ans2 && ans2 == ans3 && ans1 != -1) { printf("YES "); } else{ printf("NO "); } return 0; }
以上是关于bfs(同一最短路径)的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode1293网格中的最短路径(DFS和BFS)分析