$$\color{red}{算法}\color{blue}{基础课}\color{purple}{笔记and题解}\color{green}{汇总}$$
笔记:
用$BFS$遍历图。
先在队列中加入源点,然后对于每次取出队头,拓展与队头节点有相邻连边的节点,记得判重。如果还没有到达过这个点则可以拓展。
$BFS$查的一定是最短路。
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int h[N], e[N], idx, ne[N];
int n, m, d[N], q[N];
void add(int a, int b) {
e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}
int bfs() {
int hh = 0, tt = 0;
q[0] = 1;
memset(d, -1, sizeof d);
d[1] = 0;
while (hh <= tt) {
int t = q[hh++];
for (int i = h[t]; ~i; i = ne[i]) {
int j = e[i];
if (d[j] == -1) {
d[j] = d[t] + 1;
q[++tt] = j;
}
}
}
return d[n];
}
int main() {
cin>>n>>m;
memset(h, -1, sizeof h);
while (m--) {
int a, b; cin>>a>>b;
add(a, b);
}
cout<<bfs();
}
建议更新进阶课笔记
进阶课卷不动……先把基础课全部肝完(
刷氵题)然后死拼提高课,接下来进阶课跳着看……就学到什么算法听一下就好,感觉进阶课有点要命QwQ
提高课看彩色铅笔聚聚的就好了
虽然基础课都是“氵题”但是我觉得用y总的理解方式再回顾一下挺好的hh