思路:将dijkstra弱化成边权为1的时候就可以用多源bfs来做
应用:求到最近的起点的距离
1.将到终点距离为0的点优先压入队列(此为第一层)
2.依次将没入队的扩展进来
第一层:全为0;
第二层:全为1,扩展进来
第三层:全为2,扩展进来
第三层:全为3,扩展进来
感性理解
理性证明:利用dijkstra构造一个虚拟远点到每个起点的权重为0
题目描述
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn=1010;
char g[maxn][maxn];
int vis[maxn][maxn];
int d[maxn][maxn];
int n,m;
struct P{
int x;
int y;
};
int dx[4]={1,0,-1,0};
int dy[4]={0,-1,0,1};
queue<P> q;
void bfs()
{
while(!q.empty())
{
auto t=q.front();
q.pop();
for(int i=0;i<4;i++)
{
P now;
now.x=t.x+dx[i];now.y=t.y+dy[i];
if(!vis[now.x][now.y]&&now.x>=0&&now.x<n&&now.y>=0&&now.y<m)
{
vis[now.x][now.y]=1;
d[now.x][now.y]=d[t.x][t.y]+1;
q.push({now.x,now.y});
}
}
}
}
int main(void)
{
cin.tie(0);std::ios::sync_with_stdio(false);
memset(d,-1,sizeof(d));
cin>>n>>m;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
cin>>g[i][j];
if(g[i][j]=='1')
{
vis[i][j]=1;
d[i][j]=0;q.push({i,j});
}
}
bfs();
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cout<<d[i][j]<<' ';
}
cout<<endl;
}
return 0;
}
高数大佬是怎么 变强的?