题目:
https://www.luogu.com.cn/problem/P1332
思路:
相同路径代价的最短路可以用BFS解决。
最短路的距离问题需要标记数组,用标记数组表示是否在队列里,防止重复入队列。
起点入队 + 广搜 + 松弛操作
核心代码:
代码:
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
const int N = 1510;
const int mod = 1000000007;
int n,m,x,y;
int mx[15]={0,1,-1,0,0};
int my[15]={0,0,0,1,-1};
int g[510][510];
int book[510][510];
void bfs(int x, int y){ //位置
queue<pair<int , int>> q;
q.push({x,y});
book[a][b] = 1;
while(q.size()){
int tx = q.front().first, ty = q.front().second;
q.pop();
book[tx][ty] = 0;
for(int i=1;i<=4;i++){
int xx =tx + mx[i];
int yy =ty + my[i];
if(xx<=0||xx>n||yy<=0||yy>m) continue;
if(g[xx][yy] > g[tx][ty] + 1){
g[xx][yy] = g[tx][ty] + 1;
if(book[xx][yy]==0){
book[xx][yy] = 1;
q.push({xx,yy});
}
}
}
}
}
int maxx;
int main(){
cin >> n >> m >> x >> y;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
g[i][j] =INF;
int a,b;
while(x--){
cin >> a >> b;
g[a][b] = 0;
bfs(a,b);
}
while(y--){
cin >> a >> b;
cout << g[a][b] << endl;
}
return 0;
}
BFS :
void bfs(int x,int y){
队列queue<> q 注意(pair<int , int >)
(x,y)入队
while(队列不空){
//根据题意
如,int tx , ty ; for() {}
}
}