您的位置:首页 > 其它

利用BFS求最短路

2016-10-12 21:37 218 查看
利用BFS求图的最短路,

POJ3984

#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<string.h>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn = 5;

struct Node {
int x, y;
Node(int a=0, int b=0) :x(a), y(b) {}
};//node表示一个点,x为x坐标,y为y坐标
int G[maxn][maxn];//G存储的是迷宫的信息,0为障碍物
int dis[maxn][maxn];//到起点的距离
Node path[maxn][maxn];//存储此节点的“父亲”

const int dir[4][2] = { { 0, 1 }, { 0, -1 }, { -1, 0 }, { 1, 0 } };
bool isleg(int x, int y)
{
return ( x>=0 && y >= 0 && x < maxn&&y < maxn
&& dis[x][y] == -1 && !G[x][y] );//dis[x][y]==-1表示未经过此点
}
void bfs()
{
queue<Node>Q;
Q.push(Node(0, 0));
memset(dis, -1, sizeof(dis));
dis[0][0] = 0;
while (!Q.empty()) {
Node u = Q.front();
Q.pop();
for (int i = 0; i < 4; i++) {
int dx = u.x +dir[i][0];
int dy = u.y + dir[i][1];
if (isleg(dx, dy)) {
dis[dx][dy] = dis[u.x][u.y] + 1;//
path[dx][dy] = u;
Q.push(Node(dx, dy));
}
}
}
}
void printPath(Node u)
{
if (!u.x&&!u.y) {
printf("(0, 0)\n");
return;
}
printPath(path[u.x][u.y]);
printf("(%d, %d)\n", u.x, u.y);
}
int main()
{
int i, j;
for (i = 0; i < maxn; i++)
for (j = 0; j < maxn; j++)
scanf("%d", &G[i][j]);
bfs();
printPath(Node(4, 4));//递归打印路径
return 0;
}


在这里,BFS求出了每个点到起点的最短距离

注意, 只要"某个点到起点的距离"从初始状态被赋值, 那么这个值就是最优的, 因为可以把BFS之后的图看为是一个BFS树, 某点的所在的"层数"就是其到起点的距离, 当其被BFS第二次的时候的"层数"一定 大于或等于 第一次的"层数", 即离起点更远了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: