宽度优先搜索(BFS)
其实在此之前我一直觉得宽搜很难很难理解,但是在过完一遍算法基础课后我回头复习最短路之后,我再来看BFS,觉得BFS的模板代码也就那样,长得有点像这些最短路的代码了。其实这些求解最短路的模板中多多少少都用到了队列这个数据结构,怎么说呢,其实也没那么难,之前完全是自己被自己吓到了。
分析:
用BFS求最短路,前提是边权都为1。然后建图,初始化距离,然后左右上下移动,如果可以走,就放到队列里,等待下一步,然后就出结果了。。。。。(wokao,我明白队列的含义了!这里的队列相当于一个缓冲区,就是说所有满足可以向前走一步的点的下一个点都可以进来,然后排排队,等新一轮循环,你们再轮流出去走一步看看能不能走,如果可以就继续重复操作)
模板:
queue<int> q; st[1] = true; // 表示1号点已经被遍历过 q.push(1); while (q.size()) { int t = q.front(); q.pop(); for (int i = h[t]; i != -1; i = ne[i]) { int j = e[i]; if (!st[j]) { st[j] = true; // 表示点j已经被遍历过 q.push(j); } } }
typedef pair<int,int>PII; int g[N][N], d[N][N]; int n, m; int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0}; int bfs() { memset(d, -1, sizeof d); d[1][1] = 0; queueq; q.push({1, 1}); while(q.size()) { auto t = q.front(); q.pop(); int x = t.first, y = t.second; for(int i = 0; i < 4; i++) { int xx = x + dx[i], yy = y + dy[i]; if(xx >= 1 && xx <= n && yy >= 1 && yy <= m && g[xx][yy] == 0 && d[xx][yy] == -1) { d[xx][yy] = d[x][y] + 1; q.push({xx,yy}); } } } return d[n][m]; }
NICE!!!