样例图:
1.我们发现从节点1走到节点4最短路径是1。
2.这是一个有向图,因此只需要在两个点之间加1条边即可。
#include <bits/stdc++.h>
using namespace std;
int n, m;
const int N = 1e5 + 10;
int h[N]; //存储头节点
int ne[N]; //下一个节点的指针
int e[N]; //边值
int idx; //地址
int st[N]; //打标记防止一个节点走多次
int dist[N]; //距离数组
//邻接表存图
void add(int a, int b) { //在a,b两个点之间建一条边
e[idx] = b; //把值赋给e
ne[idx] = h[a]; //头指针指向下一个节点
h[a] = idx++; //头指针移动到下个节点
}
void bfs() {
memset(dist, 0x3f, sizeof(dist)); //初始化每个节点都为没走过
dist[1] = 0; //初始节点到初始节点的距离为0
queue<int>q;
q.push(1); //加入初始节点
st[1] = 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]) { //如果没有遍历过
dist[j] = dist[t] + 1; //更新一下距离
q.push(j); //当前点加入队列
st[j] = 1; //当前点标记为走过
}
}
}
}
int main() {
cin >> n >> m;
memset(h, -1, sizeof h); //初始化所以头节点
//建立m条边
for (int i = 0; i < m; i++) {
int a, b;
cin >> a >> b;
add(a, b);
}
bfs();
if (dist[n] == 0x3f3f3f3f) { //如果距离没有变化说明走不到终点
cout << -1; //输出-1即可
} else {
cout << dist[n]; //否则就输出最短距离
}
return 0;
}